我想知道如何最好地解决这个问题,因为在我看来,我现在拥有的东西非常适合硬编码的列——我想知道如何扩展它以允许该列是动态的。
Controller :
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 语句(快速,肮脏,但有效)
最佳答案
这可能是您想要使用 Linq Dynamic Query 的那种东西C# Linq 示例中包含的库。这样,您就可以像这样编写查询:
var groups = Model.GroupBy("SomeColumn, SomeOtherColumn")
...如果您接受来自用户的列名,这将更容易管理 - 很可能您所拥有的只是作为字符串的列名,并且该库会自动为您将它们解析为 lambda 表达式. (如果您预计可能出现无效输入,则需要捕获 ParseException
)。
为了格式化 key ,您可以直接将其传递给 Html.Encode
方法,因为它的默认字符串表示类似于 { ID = 1, Name = Test }
。如果这足够好,那么我会保留它,否则您将不得不使用反射来解析各个关键属性和属性值。
编辑:您可以在任何地方使用该库,如果您下载示例,您将看到它只是一个源代码文件。
关于c# - ASP.NET MVC 中的动态 LINQ 分组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448611/