【问题标题】:Dynamic LINQ Group By Query in ASP.NET MVCASP.NET MVC 中的动态 LINQ 分组查询
【发布时间】:2011-01-27 18:18:44
【问题描述】:

我想知道如何最好地解决这个问题,因为在我看来,我现在所拥有的对于硬编码列非常有用——我想知道如何扩展它以使列成为动态的。

控制器:

var dc = new DataContextDC();
return View(dc.items.Where(i=>i.IsPublic == true));

查看:

<% foreach (var grp in Model.GroupBy(s => s.GroupColumn)) { %>
    <%= Html.Encode(grp.Key) %>
    <% foreach (var item in grp) { %>
        <%= Html.Encode(item.Title) %>
    <% } %>
<% } %>

如上所述,目标是让用户选择哪个列替换上面的“GroupColumn”。我想避免添加任何外部库等。

我看到使用反射(缓慢,但完全动态),或者因为这是我的应用程序中的一个视图,我只是为数据库中的每一列复制上述代码,然后在其上放置一个 switch 语句(快速,肮脏,但有效)

【问题讨论】:

    标签: c# .net asp.net-mvc linq


    【解决方案1】:

    这可能是您想要使用 C# Linq 示例中包含的 Linq Dynamic Query 库的类型。这样,您可以像这样编写查询:

    var groups = Model.GroupBy("SomeColumn, SomeOtherColumn")
    

    ...如果您从用户那里接受列名,这将更容易管理 - 很可能您所拥有的只是作为字符串的列名,并且该库会自动为您将它们解析为 lambda 表达式. (如果您预计输入无效的可能性,您需要捕获ParseException)。

    对于格式化密钥,您可以直接将其传递给Html.Encode 方法,因为它的默认字符串表示类似于{ ID = 1, Name = Test }。如果这足够好,那么我将不理会它,否则您将不得不使用反射来解析各个关键属性和属性值。

    编辑:您可以在任何地方使用该库,如果您下载示例,您会发现它只是一个源代码文件。

    【讨论】:

    • 最佳做法是什么?我应该单独编译 .CS 文件吗?还是应该将其包含在我自己的项目中?
    • @Nate Bross:没有具体的最佳实践;如果您预见到您可能会在不同的应用程序中重用该功能,则将其编译为单独的库(已经有一个 .sln 供您执行此操作),否则任何一种方式都有效。它是 MSPL,所以你基本上可以用它做任何你想做的事情;您唯一不能做的就是在顶部没有版权行的情况下重新分发源文件本身。
    • 好的,叫我笨蛋,但我无法让这段代码在视图中工作,它在我的控制器中工作,但我不知道如何将using System.Linq.Dynamic 添加到视图和&lt;%@ Import ... %&gt; 也不起作用,我缺少什么吗?
    • @Nate Bross:如果您打算在多个页面上使用它,最好将程序集和命名空间添加到 web.config 文件中。请参阅此处:west-wind.com/WebLog/posts/753705.aspx(您关心的部分是system.web/pages/namespacessystem.web/compilation/assemblies。如果这不起作用...发布您使用的代码/配置。
    【解决方案2】:

    【讨论】:

    • 这个库准备好了吗?在封闭源应用程序中可以免费使用吗?
    • 恕我直言,在您编写测试以涵盖您的使用场景之前,库还不能用于生产。
    • @jfar 在生产中使用 String 对象之前,您真的编写测试来验证 System.String 是否有效吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多