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

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

我正在使用 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 过于有限 - 许多函数不受支持,不喜欢子集合,并要求您使用受支持的“聚合”函数之一,这些函数是不多于且不少于 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)")

关于entity-framework - 按集合属性对动态 LINQ 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496303/

相关文章:

asp.net - 针对测试数据库集成测试 Web 服务

c# - 如何在 Entity Framework 查询中使用左连接?

ios - 根据元组的第二个值对数组进行排序

python - 列上的十分位数 Pandas DataFrame

c# - MVC 5、EF 6 Barebones 无效的列名称 'Model'

c# - Entity Framework Code-First 启动时太慢

database - 在数据访问 block 5.0 或 Entity Framework 4.0 之间进行选择

c# - LINQ to Entities .Contains 元组(2 个外键)

file - PowerShell:如何按列对文本文件进行排序?

c# - 分析 WPF + WCF + EF 应用程序