按动态LINQ按集合属性排序

时间:2016-02-19 02:34:01

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

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

父母 - >儿童(儿童型收藏)

儿童拥有财产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")

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

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

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

研究的代码示例:

1 个答案:

答案 0 :(得分:1)

没有通用的解决方案。与{"正常"相比,System.Linq.Dynamic太有限了。 LINQ - 不支持许多功能,不喜欢子集合,并要求您使用受支持的"聚合"函数不超过AnyCountMinMaxSum和平均值。

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