2016-10-04 41 views
0

我有這個疑問:LINQ包括孩子的價值觀錯誤

var allValues = from p in _pContext.Persons 
where p.Id == currentPerson.Id 
from i in p.Items //This is a list that contains "Items" 
select i; 

我想擁有的所有項目,所有它們包含嵌套值。如何在執行此查詢時加載這些查詢?我知道我可以在上下文中使用的包含語句,但那不會導致任何地方。如果我f.e.做到這一點:

var allValues = from p in _pContext.Persons.Include("Items.Properties") 
where p.Id == currentPerson.Id 
from i in p.Items //This is a list that contains "Items" 
select i; 

得到裝載它們相關聯的「屬性」的所有物品,這些性能的arent裝,他們的名單被實例化,但它不包含任何。

+0

不同版本的包括法確實在不同的類存在。那個人接受一個lamda,在那裏你指定要包含的相關對象。據我所知,你需要使用:'使用System.Data.Entity;'才能使用。 – Max

+0

你有人與物品之間的一對多關係嗎? – octavioccl

+0

對不起,我不能使用lambda表達式,因爲我使用的是EF,它不支持包含lambda表達式的MySQL,據我所知。 – Ravior

回答

2

Include有許多錯覺的怪癖。其中之一是,如果查詢形狀在應用後發生更改,則Include將被忽略。這發生在你的情況。該Inlude作品如果查詢看起來是這樣的:

from p in _pContext.Persons.Include("Items.Properties") 
select p 

這是因爲路徑"Items.Properties"是穿越關中最終結果的實體:Person

但現在您可以通過更改返回實體更改查詢的形狀......

from p in _pContext.Persons.Include("Items.Properties") 
from i in p.Items 
select i 

...幷包含路徑不再有效。 (不可穿越Item)。

對於Include有一個簡單的拇指規則:將其應用於查詢的末尾。這樣做,你會自動輸入正確的路徑,尤其是。當您使用lambda語法:

(from p in _pContext.Persons 
from i in p.Items 
select i).Include("Properties") 

(from p in _pContext.Persons 
from i in p.Items 
select i).Include(i => i.Properties)