为什么不包含有什么影响?

时间:2015-03-27 12:21:06

标签: c# linq entity-framework extension-methods

我正在执行以下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;
}

我不知道为什么,因为当我使用像_context.SharePeople.Include(p => p.Person)那样的常规扩展方法时,它可以工作。

2 个答案:

答案 0 :(得分:3)

This post清楚地描述Include何时起作用,但没有效果。

关键部分是查询的形状,即所选列。如果在Include之后有任何更改形状,Include将不再有效。

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

  1. from q in _context.Cars:查询只返回Car
  2. join s in _context.SharesCar + Share
  3. join p in _context.SharePeopleCar + Share + SharePeople列。 这是包含
  4. select p,仅SharePeople
  5. 一旦你意识到这一点,补救措施很简单:

    (from q ... select p).Include(p => p.Person)
    

    当查询的形状看似没有改变,但查询产生投影时,这也适用。假设你有select new { q, s, p }。这仍然会选择Car + Share + SharePeople列,与Include之前的列相同。但是,查询会生成匿名类型。此类型本身没有可由Include填充的任何导航属性,因此Include无法执行任何操作。这是by design

答案 1 :(得分:0)

使用ste-fu方法它没有用,但有了它的变化我能够把它用于工作。

我想Gert Arnold回答为什么它不起作用,但是因为我在这里工作的是代码:

var sharePeople = Context.SharePeople.Include("Person");

return sharePeople.Where(s => s.Shares.Car.CarId == carId);