2

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

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

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

谢谢

4

3 回答 3

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

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

于 2015-02-17T15:50:16.283 回答
0

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

希望这会有所帮助。

于 2012-05-30T21:07:15.910 回答
0

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

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

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

于 2012-05-30T20:51:00.537 回答