2015-09-07 94 views
1

我正在使用EF6,并且试图获取实体列表。对于列表中的每个实体,我希望它在一次调用中填充子实体。如何获取实体及其所有相关实体

例如:

Order.Id 
Order.ColletionOfItems 

Item.Id 
Item.OrderId 
Item.ProductName 
Item.CollectionOfOptions 

Option.Name 
Option.Value 

using(var db = DbContext) 
{ //I want to fill in everything during this call as I am using all of it in the 
    //The calling function. 
    OrderList = db.Orders.Select().include //This is where I am stuck 
    return OrderList; 
} 

我想返回的集合有所有的订单,关联到单个订单的所有项目,并关联到单个项目的所有选项。

如何构建linq语句来完成此操作?那么.Include("MyMajicString")有没有更好的方法?我应该实际搜索什么,因为我的搜索导致很少可接受的回复?

+0

我相信如果你有子实体的导航属性,你甚至不需要使用include()(除非你有ProxyCreationEnabled = false),当实体被填充时,它也填充导航属性。 –

回答

4

您需要使用Include扩展方法:

using(var db = new YourContext()) 
{ 
    var OrderList = db.Orders.Include(o=>o.ColletionOfItems.Select(i=>i.CollectionOfOptions)); 
    return OrderList; 
} 

您还可以使用DbQuery.Include方法,它接受作为参数的导航路径。你想要的属性加载为string

using(var db = new YourContext()) 
{ 
    var OrderList = db.Orders.Include("ColletionOfItems.CollectionOfOptions"); 
    return OrderList; 
} 

但最好使用第一个原因是强类型。使用第二种方法,可以输入其中一个属性的名称时出错,或者可以更改导航的名称。将来模型中的属性,并忘记重命名路径中的属性。

另一件事,小心加载大量的数据。使用该查询,您将加载所有订单和相关属性,因此,请先将您需要的信息加载到应用程序之前,先尝试过滤(在调用Include之后调用Where方法)。

+0

我有VS 2012和EF6,但我找不到'DbExtensions.Include'方法。从链接看起来它只是EF5的版本,那么如果我们在EF6中需要类似的东西呢? – Hopeless

+0

使用相同的方法,检查此[链接](http://stackoverflow.com/questions/23640945/where-is-include-dbextension-for-ef-6-0) – octavioccl

+0

有相同的方法命名包括,但它是在'QueryableExtensions'下(也许这是EF6中的新功能),但在'DbExtensions'下找不到任何东西。 – Hopeless

相关问题