ASP.NET MVC中的动态LINQ Group By Query

时间:2010-03-15 16:11:50

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

我想知道如何最好地解决这个问题,因为我现在对我的视图中的硬编码列非常有用 - 我想知道如何扩展它以使列成为动态。

控制器:

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”。我想避免添加任何外部库等。

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

2 个答案:

答案 0 :(得分:4)

这可能是你想要使用C#Linq样本中包含的Linq Dynamic Query库的那种东西。这样,您可以像这样编写查询:

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

...如果你接受用户的列名,这很容易管理 - 很可能你只有列名作为字符串,这个库会自动将这些列解析为lambda表达式。 (如果您预计输入无效的可能性,则需要捕获ParseException

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

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

答案 1 :(得分:1)