C# 如何在lambda表达式中使用子集合进行排序

C# 如何在lambda表达式中使用子集合进行排序,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个使用lambda表达式的查询,我希望能够从作为父表的子集合的表中的列进行排序。查询如下所示: var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.OrderBy(t => t.SortOrder)); SortOrder列位于Timelines实体下的3个级别,我不知道使用哪个扩展访问它。当我使用上面的代码时,我得到一个错误

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

 var query = ctx.Timelines.Include("Rule.DocumentRules").Where(...).OrderBy(o => o.Rule.DocumentRules.OrderBy(t => t.SortOrder));
SortOrder列位于Timelines实体下的3个级别,我不知道使用哪个扩展访问它。当我使用上面的代码时,我得到一个错误“DbSortClause表达式必须具有顺序可比的类型。 参数名称:key”。如果使用Select扩展而不是第二个OrderBy,则会出现相同的错误。有人知道我如何按此列排序吗?此“SortOrder”列不是主键或外键


谢谢

看起来您正在尝试按多个子项排序,这对编译器来说没有意义。如果这两个实体之间确实存在1:1的关系,那么您可以尝试以下方法

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

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

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


希望这会有所帮助。

我知道这是一个老帖子,但我遇到了这篇帖子,因为我遇到了同样的问题,因为它没有答案,我想我会分享我的解决方案,以防它对其他人有所帮助

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

按预期工作的简单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

很可能有更好/不同的方法来实现这一点,但这实现了我想要的,所以我想我会与大家分享。

按整个子实体序列排序是荒谬的。只有将子实体集合并为一个值,然后用于排序,这才有意义。这可以通过选择单个实体(通过
First()
)或使用聚合运算符(如
Max
Sum
)来实现。看起来您正在尝试同时按多个对象进行排序?当使用第一个()方法时,我得到了1到1个关系。当我使用“方法”时,只能作为最终的查询操作。在这个例子中考虑使用方法“FrestRealDebug”。“FrStestDebug()不失败,但是它没有按正确的顺序返回它们。时间线和DocumentRule之间没有直接关系。时间线可以有一条规则,规则可以有一条规则。DocumentRule表有一个我想在OrderBy中使用的SortOrder列。我可以在SQL中这样实现:对不起…被切断了。从时间线t中选择*内部联接[rule]r on t.ruleid=r.ruleid内部联接文档rule d on t.ruleid=d.ruleid其中order by d.sortorder我应该说一个时间线可以有一个规则,一个规则可以存在于多个DocumentRules中。DocumentRule表是一个查找表,只是规则表的一个子集。谢谢。如果给定的时间线有3种不同的文档规则,我应该使用这三种规则中的哪一种来排序?如果我有两个不同的时间表,每个时间表都有3个不同的文档规则,那么现在我有9个单独的可排序项目,但我只尝试对两个项目进行排序。因此,您必须编写一些内容来指定要按哪些文档规则进行排序。相反,您可以向时间线添加排序顺序在大多数情况下,我仅显示时间线表中的信息,但如果存在关联的文档条件,则我需要链接到DocumentRule表,以仅显示此表中列出的某些规则,并且我需要按Sortorder列对它们进行排序。因此,如果此表中有7条记录,则我的sortorder列将相应地从1到7编号。此外,我没有意识到,使用about First()或FirstOrDefault()将导致您选择第一个documentRule。如果给定规则没有文档规则,First和FirstOrDefault()都将导致对sortorder的空引用