代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

ASP.NET MVC中的动态Linq Group by Query

  •  3
  • Nate CSS Guy  · 技术社区  · 15 年前

    我想知道如何最好地解决这个问题,因为我现在所拥有的对于视图中的硬编码列非常有用——我想知道如何扩展它以允许该列是动态的。

    控制器:

    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 回复  |  直到 15 年前
        1
  •  4
  •   Aaronaught    15 年前

    这可能是你想用LINQ的东西 Dynamic Query 包含在c_linq示例中的库。这样,您就可以这样编写查询:

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

    …如果您接受来自用户的列名,那么管理起来就容易得多-很可能您所拥有的只是作为字符串的列名,而这个库将自动将这些列解析为lambda表达式。(你得抓住 ParseException 如果您希望输入无效)。

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

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