ASP.NET MVC中的动态LINQ分组查询

3
我想知道如何最好地解决这个问题,因为我现在拥有的对于视图中的硬编码列非常有效。我想知道如何将其扩展以允许该列是动态的。
控制器:
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语句(快速、简单但有效)。

2个回答

4

如果您想要使用C# Linq示例附带的Linq Dynamic Query库,那么您需要像这样编写查询:

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

如果您从用户那里接受列名称,那么使用此库来自动将这些列名称解析为lambda表达式会更加容易管理。 (如果您预计存在无效输入的可能性,则需要捕获ParseException)。

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

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


什么是最佳实践?我应该单独编译.CS文件吗?还是应该将它包含在我的项目中? - Nate
1
@Nate Bross:没有具体的最佳实践;如果你预见在不同的应用程序中可能会重用功能,则将其编译为单独的库(已经有一个.sln供您使用),否则任何方式都可以。它是MSPL,因此您基本上可以随意使用它;唯一不能做的事情是在没有版权行的情况下重新分发源文件本身。 - Aaronaught
好吧,你可以说我很愚蠢,但我无法让这段代码在视图中工作,它在我的控制器中可以工作,但我无法弄清楚如何将using System.Linq.Dynamic 添加到视图中,而 <%@ Import ... %> 也无效,有什么我错过的东西吗? - Nate
1
@Nate Bross:如果你计划在多个页面上使用它,最好将程序集和命名空间添加到web.config文件中。参见这里:http://www.west-wind.com/WebLog/posts/753705.aspx(你关心的部分是`system.web/pages/namespaces`和`system.web/compilation/assemblies`)。如果还不行,请发布你使用的代码/配置。 - Aaronaught

1

这个库已经可以用于生产环境了吗?它可以在闭源应用程序中免费使用吗? - Nate
1
在我看来,只有在编写测试以覆盖使用场景后,库才能达到生产就绪状态。 - John Farrell
@jfar 在生产环境中使用 String 对象之前,您真的编写测试来验证 System.String 正常工作吗? - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接