在实体框架中按子表排序

时间:2014-09-07 17:42:58

标签: c# linq entity-framework

在我的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

2 个答案:

答案 0 :(得分:4)

你可以这样做。

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仅选择国家/地区,匿名类型中的People也会连接到每个国家/地区的人物属性。

生成的sql将按查询包含订单,如。

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

<强> PS

作为急切加载的解决方法,你可以做的是做关系修复。使用这种方法只会有一个数据库往返,而不是首先加载所有国家,然后加载每个人。

  

关系修复是EF,链接相关的过程   实体在一起。例如,fix-up将设置“Customer”属性   当已知的相关客户实现时,订单的订单   数据库。一旦理解了修复,就可以利用它来完成所有工作   各种有趣的事情。 - Entity Framework Jargon by Alex D James

答案 1 :(得分:2)

不支持此功能。通过循环访问从数据库检索的国家/地区集合并订购其People属性,您可以在执行查询后在客户端上订购子集合。