2015-09-07 106 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

相關問題