按集合对动态 LINQ 进行排序 属性

Sorting Dynamic LINQ By Collection Property

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

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

Child 有 属性 SortingOrder

我想检索 Parent 的列表,包括 Children 并按排序顺序排序。

我可以使用 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()) 但不确定该怎么做,或者非常感谢任何其他帮助。

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

研究过的代码示例:

没有通用的解决方案。 System.Linq.Dynamic 与 "normal" LINQ 相比过于有限 - 许多函数不受支持,不喜欢子集合并要求您使用受支持的 "aggregate" 函数之一,这些函数不再存在并且不少于 AnyCountMinMaxSum 和 Average`.

但是,您的具体案例有 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))

动态 LINQ 会像这样

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