【问题标题】:Sorting Dynamic LINQ By Collection Property按集合属性对动态 LINQ 进行排序
【发布时间】:2016-05-31 11:52:33
【问题描述】:

我正在使用 System.Linq.Dynamic 并具有以下简化结构(模型):

Parent -> Children(Child 类型的集合)

孩子拥有财产SortingOrder

我想检索父母列表,包括孩子和按排序顺序排序。

我可以用 LINQ / C# 代码做到这一点

Parents.OrderBy(x=>x.Children.OrderBy(z=>z.SortingOrder).Select(z=>z.SortingOrder).FirstOrDefault())

它适用于 EF (6.0) 但问题在于所有使用字符串的动态示例我找不到从字符串创建相同表达式的解决方案。所以最终应该是这样排序的

Parents.Include("Children").OrderBy("Children.SortingOrder")

显然,作为集合的 Children 没有 SortingOrder,因此所有示例都失败了。

请指教,几个小时都找不到解决方案。我认为解决方案是动态创建 lambda 表达式 (x=>x.Children.OrderBy(z=>z.SortingOrder).Select(z=>z.SortingOrder).FirstOrDefault()) 但不确定如何执行此操作,或者非常感谢任何其他帮助。

我确信它是可行的,因为它作为编译后的强类型表达式工作。

研究的代码示例:

【问题讨论】:

    标签: entity-framework linq sorting dynamic sql-order-by


    【解决方案1】:

    没有通用的解决方案。 System.Linq.Dynamic 与“普通”LINQ 相比过于有限 - 不支持许多函数,不喜欢子集合并要求您使用支持的“聚合”函数之一,这些函数不多也不少于 AnyCountMinMaxSum 和平均`。

    但是,您的具体案例有 Dynamic LINQ 支持的替代解决方案。

    以您的示例查询为例。

    Parents.OrderBy(x => x.Children.OrderBy(z => z.SortingOrder).Select(z => z.SortingOrder).FirstOrDefault())
    

    等价于

    Parents.OrderBy(p => p.Children.Min(c => c.SortingOrder))
    

    Dynamic LINQ 会是这样的

    Parents.OrderBy("Children.Min(SortingOrder)")
    

    【讨论】:

    • 谢谢!我正在使用非常简化的示例。例如,而不是 SortingOrder(假设为整数),它将是任何其他类型 - bool、字符串等。我可以尝试您的建议,看看会发生什么。
    • 它在数值上工作得很好(可能在日期上)。我不得不将布尔值转换为 1/0,所以它部分工作:)
    • 动态 LINQ 没有其他选择。它应该适用于具有 Enumerable.Min 函数重载的每种类型,即所有数字类型和 DateTime。对于布尔值 - 你这样做的方式。对于字符串 - 没办法,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多