我想知道如何最好地解决这个问题,因为我现在对我的视图中的硬编码列非常有用 - 我想知道如何扩展它以使列成为动态。
控制器:
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语句(快速,脏,但有效)
答案 0 :(得分:4)
这可能是你想要使用C#Linq样本中包含的Linq Dynamic Query库的那种东西。这样,您可以像这样编写查询:
var groups = Model.GroupBy("SomeColumn, SomeOtherColumn")
...如果你接受用户的列名,这很容易管理 - 很可能你只有列名作为字符串,这个库会自动将这些列解析为lambda表达式。 (如果您预计输入无效的可能性,则需要捕获ParseException
。
为了格式化密钥,您可以直接将其传递给Html.Encode
方法,因为它的默认字符串表示形式类似于{ ID = 1, Name = Test }
。如果这足够好,那么我会不管它,否则你将不得不使用Reflection来解析各个键属性和属性值。
编辑:你可以在任何地方使用该库,如果下载样本,你会发现它只是一个源代码文件。
答案 1 :(得分:1)