按实体框架中的子表排序

本文关键字:排序 实体 框架 | 更新日期: 2023-09-27 18:21:09

在我的Linq中,我访问一个简单的主/细节表:

_db.Countries.Include(x=>x.People);

我希望人们按姓氏排序,但当我在include中包含订单时,错误为:

The Include path expression must refer to a navigation property defined on the type. 
Use dotted paths for reference navigation properties and the Select operator for collection navigation properties. Parameter name: path

按实体框架中的子表排序

您可以这样做。

var countries = _db.Countries
   .Select(c => new 
   {
       Country = c,
       People = c.People.OrderBy(p => p.Lastname)
   })
   .AsEnumerable() // not execute yet
   .Select(a => a.Country)
   .ToArray(); // execute

即使Select只选择Country,匿名类型的People也会连接到每个Country的People属性。

生成的sql将包括类似查询的订单。

ORDER BY [Project1].[Id] ASC, [Project1].[C1] ASC, [Project1].[Lastname] ASC

PS

作为一个急于加载的工作,你能做的就是修复关系。使用这种方法将只有一个数据库往返,而不是先加载所有国家,然后加载每个人。

关系修复是EF、链接实体在一起。例如,修复将设置"客户"属性当一个已知的相关客户从数据库。一旦你了解了修复,你就可以利用它来完成所有的工作各种有趣的事情。-Alex D James 的实体框架Jargon

这是不受支持的。执行查询后,您可以在客户端上对子集合进行排序,方法是循环遍历从数据库检索到的countries集合并对其People属性进行排序。