我正在使用 System.Linq.Dynamic 并具有以下简化结构(模型):
父级 -> 子级(子级类型的集合)
子级具有属性SortingOrder
我想检索包含 child 的 parent 列表并按排序顺序排序。
我可以使用 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())
但不知道如何做到这一点,或任何其他帮助非常感谢。
我确信它是可行的,因为它作为编译的强类型表达式工作。
研究的代码示例:
最佳答案
没有通用的解决方案。与“普通”LINQ 相比,System.Linq.Dynamic
过于有限 - 许多函数不受支持,不喜欢子集合,并要求您使用受支持的“聚合”函数之一,这些函数是不多于且不少于 Any
、Count
、Min
、Max
、Sum
和平均值`。
但是,您的具体情况有动态 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)")
关于entity-framework - 按集合属性对动态 LINQ 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496303/