LINQ包含子项值的错误

时间:2016-10-04 17:18:31

标签: c# entity-framework linq nested-queries

我有这个问题:

ThreadBoundary

我希望拥有它们包含的所有项目和所有嵌套值。如何在执行此查询时加载这些?我知道我可以在上下文中使用的include语句,但这并不能引导任何地方。如果我f.e.这样做:

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;

要获取所有加载了相关“属性”的项目,这些属性未加载,它们的列表是实例化的,但它不包含任何内容。

1 个答案:

答案 0 :(得分: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)