如何排序通过在 lambda 表达式中使用子集合

本文关键字:表达式 lambda 子集合 何排序 排序 | 更新日期: 2023-09-27 18:36:01

我有一个使用 lambda 表达式的查询,我希望能够从表中的列进行排序,该列是父表的子集合。查询如下所示:

 var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.OrderBy(t => t.SortOrder));

SortOrder 列位于时间线实体下的 3 个级别,我不知道使用哪个扩展名来访问它。当我使用上面的代码时,我收到一个错误"DbSortClause 表达式必须具有顺序可比的类型。参数名称:键"。如果我使用选择扩展而不是第二个 OrderBy,我会收到同样的错误。有谁知道我如何按此列排序?此"排序顺序"列不是主键或外键。

谢谢

如何排序通过在 lambda 表达式中使用子集合

我知道

这是一个旧线程,但是当我遇到同样的问题时,我遇到了这篇文章,并且由于它没有答案,我想我会分享我的解决方案,以防它帮助了其他人。

假设您需要出示实际的父母(即...妈妈/爸爸)和他们的孩子,但您希望在报告中按字母顺序显示孩子的姓名。 如果它们在数据库中的顺序不正确,则必须按子表上的"名称"字段对它们进行排序,以便根据需要显示它们。

按预期工作的简单 T-SQL 示例:

select * from ParentTable p
inner join ChildTable c on c.ParentId = p.ParentId
where p.ParentId = 1
order by c.Name

我试图以与原始海报相同的方式完成此操作(如下所示),并得到"DbSortClause 表达式必须具有顺序可比的类型"异常。

.OrderBy(x => x.ParentTable.ChildTable.OrderBy(y => y.Name))

我正在使用投影,所以这可能不适用于所有人,但我发现如果我在子列表的投影中执行 OrderBy,它也按我想要的方式工作。

Children = x.ParentTable.ChildTable.OrderBy(y => y.Name).Select(aa => new ChildTableModel

很可能有一种更好/不同的方法来实现这一目标,但这确实是我想要的,所以我想我会分享。

看起来您正在尝试按多个子项进行排序,这对编译器来说并没有真正的意义。如果这两个实体之间确实存在 1 对 1 的关系,您可以尝试类似

var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.First().SortOrder));

这可能会导致 NULL 异常,具体取决于数据库的设置方式。

我在尝试在相关实体中按列排序时遇到了同样的问题。唯一有效的解决方案是使用实体 SQL。下面是一个使用 ESQL 查询的简单示例,它返回 ObjectQuery:将 ESQL 转换为 LINQ to Entities。按相关实体排序。

希望这会有所帮助。