为什么 Include 没有任何效果?
Why doesn't Include have any effect?
我正在执行以下 LINQ 查询,该查询有效但没有 return 导航 属性 人满,我得到 null
。
public IEnumerable<SharePeople> GetSharePeopeByCarId(int carId)
{
return from q in _context.Cars
join s in _context.Shares
on q.CarId equals s.Car.CarId
join p in _context.SharePeople.Include(p => p.Person)
on s.ShareId equals p.ShareId
where q.CarId == carId
select p;
}
我不知道为什么,因为当我使用像 _context.SharePeople.Include(p => p.Person)
这样的常规扩展方法时它起作用了。
This post 清楚地描述了 Include
何时生效和无效。
关键部分是查询的 形状 ,即 selected 列。如果在 Include
后形状发生任何变化,Include
将不再有效。
在您的查询中,形状改变了四次,在这些语句部分:
from q in _context.Cars
:查询将 return 只有 Car
列
join s in _context.Shares
:Car
+ Share
列
join p in _context.SharePeople
: Car
+ Share
+ SharePeople
列。 这是包含。
select p
,只有 SharePeople
列
一旦你意识到这一点,补救措施就很简单了:
(from q ... select p).Include(p => p.Person)
这也适用于查询的形状看似没有改变,但查询产生投影的情况。假设你有 select new { q, s, p }
。这仍然是 select Car
+ Share
+ SharePeople
列,与 Include
之前相同。但是,查询会生成一个匿名类型。这种类型 本身 没有任何可以由 Include
填充的导航属性,因此 Include
也不会做任何事情。这是 by design.
使用 ste-fu 方法它不起作用,但通过它的变体我能够让它起作用。
我想 Gert Arnold 回答了为什么它不起作用,但是因为我让它在这里工作,所以代码是:
var sharePeople = Context.SharePeople.Include("Person");
return sharePeople.Where(s => s.Shares.Car.CarId == carId);
我正在执行以下 LINQ 查询,该查询有效但没有 return 导航 属性 人满,我得到 null
。
public IEnumerable<SharePeople> GetSharePeopeByCarId(int carId)
{
return from q in _context.Cars
join s in _context.Shares
on q.CarId equals s.Car.CarId
join p in _context.SharePeople.Include(p => p.Person)
on s.ShareId equals p.ShareId
where q.CarId == carId
select p;
}
我不知道为什么,因为当我使用像 _context.SharePeople.Include(p => p.Person)
这样的常规扩展方法时它起作用了。
This post 清楚地描述了 Include
何时生效和无效。
关键部分是查询的 形状 ,即 selected 列。如果在 Include
后形状发生任何变化,Include
将不再有效。
在您的查询中,形状改变了四次,在这些语句部分:
from q in _context.Cars
:查询将 return 只有Car
列join s in _context.Shares
:Car
+Share
列join p in _context.SharePeople
:Car
+Share
+SharePeople
列。 这是包含。select p
,只有SharePeople
列
一旦你意识到这一点,补救措施就很简单了:
(from q ... select p).Include(p => p.Person)
这也适用于查询的形状看似没有改变,但查询产生投影的情况。假设你有 select new { q, s, p }
。这仍然是 select Car
+ Share
+ SharePeople
列,与 Include
之前相同。但是,查询会生成一个匿名类型。这种类型 本身 没有任何可以由 Include
填充的导航属性,因此 Include
也不会做任何事情。这是 by design.
使用 ste-fu 方法它不起作用,但通过它的变体我能够让它起作用。
我想 Gert Arnold 回答了为什么它不起作用,但是因为我让它在这里工作,所以代码是:
var sharePeople = Context.SharePeople.Include("Person");
return sharePeople.Where(s => s.Shares.Car.CarId == carId);