为什么 Include 没有任何效果?

Chr*_*ley 1 c# linq extension-methods entity-framework

我正在执行以下 LINQ 查询,该查询有效但不返回导航属性 Person 填充,我得到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;
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,因为当我使用常规扩展方法_context.SharePeople.Include(p => p.Person)时。

Ger*_*old 5

这篇文章清楚地描述了何时有效Include和无效。

关键部分是查询的形状,即选定的列。如果在 之后有任何改变形状Include,则Include不再起作用。

在您的查询中,形状更改了四次,在这些语句部分中:

  1. from q in _context.Cars:查询将只返回Car
  2. join s in _context.Shares: Car+Share
  3. join p in _context.SharePeopleCar+ Share+SharePeople列。这是 Include
  4. select p,只有SharePeople

一旦你意识到这一点,补救措施很简单:

(from q ... select p).Include(p => p.Person)
Run Code Online (Sandbox Code Playgroud)

这也适用于查询的形状看似没有改变但查询产生投影的情况。假设你有select new { q, s, p }. 这仍然选择Car+ Share+SharePeople栏目,和以前一样了Include。但是,查询会生成匿名类型。这种类型本身没有任何可以由 填充的导航属性Include,所以同样,Include不做任何事情。这是设计使然