LINQ包含子级值错误

本文关键字:错误 包含 LINQ | 更新日期: 2023-09-27 18:11:34

我有这个查询:

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;

我想要所有的项和它们包含的所有嵌套值。在执行此查询时,如何加载这些?我知道我可以在上下文中使用include语句,但这不会带来任何结果。如果我这样做:

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;

要加载所有项目及其关联的"属性",这些属性不会被加载,它们的列表会被实例化,但其中不包含任何属性。

LINQ包含子级值错误

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)