我正在执行以下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)
那样的常规扩展方法时,它可以工作。
答案 0 :(得分:3)
This post清楚地描述Include
何时起作用,但没有效果。
关键部分是查询的形状,即所选列。如果在Include
之后有任何更改形状,Include
将不再有效。
在您的查询中,形状会在这些语句部分中更改四次:
from q in _context.Cars
:查询只返回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 }
。这仍然会选择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);