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

时间:2012-05-30 20:41:25

标签: c# asp.net entity-framework

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

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

SortOrder列位于时间轴实体下的3个深层,我不知道使用哪个扩展来访问它。当我使用上面的代码时,我收到一个错误“DbSortClause表达式必须具有可比较的类型。 参数名称:key“。如果我使用Select扩展而不是第二个OrderBy,我会得到相同的错误。有没有人知道我如何按此列排序?这个”SortOrder“列不是主键或外键。

由于

3 个答案:

答案 0 :(得分:1)

我知道这是一个老线程,但我遇到了这个帖子,因为我遇到了同样的问题,因为它没有答案,我想我会在其帮助别人的情况下分享我的解决方案。

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

简单的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 :(得分:0)

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

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

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

答案 2 :(得分:0)

在尝试按相关实体中的列排序时,我遇到了同样的问题。唯一一个运行良好的解决方案是使用Entity SQL。下面是一个使用ESQL查询的简单示例,该查询返回ObjectQuery:Converting ESQL to LINQ to Entities. Sort by related entities

希望这会有所帮助。