我有一个多对多的关系(对于这个例子,“左”、“右”和“连接器”)和另一个实体“卫星”,它键入“左”。碰巧 Sattelite 的 FK 上也有一个唯一索引。我的目标是加载一个 Joinder 实体及其左右实体,使用 Satellite 上的属性作为 where 子句。
我尝试了多种方法,但我对 Linq 的词汇量很弱,我什至不知道我正在寻找的术语。
var joinder = dbContext.Joinders
.Include(j => j.Left)
.Include(j => j.Right)
.Include(j => j.Left.Satellites)
.FirstOrDefault(s => s.Name == "Hubble");
这不起作用,因为 FirstOrDefault 子句没有 s 的上下文来分析名称。
var joinder = dbContext.Joinders
.Include(j => j.Left)
.Include(j => j.Right)
.Include(j => j.Left.Satellites)
.Select(j => j.Left.Satellites)
.Where(s => s.Name == "Hubble");
这不起作用,因为从 Select 出来的类型IQueryable<Collection<Satellite>>
令人困惑。
var query = from j in dbContext.Joinders
join l in dbContext.Lefts on j.LeftId equals l.Id
join r in dbContext.Rights on j.RightId equals r.Id
join s in dbContext.Satellites on l.Id equals s.LeftId
where s.Name == "Hubble"
select j;
此查询编译并运行,但将完全脱水的对象返回给我——我返回的 Joinder 引用的 Left 和 Right 属性均为空。
var query = from j in dbContext.Joinders
join l in dbContext.Lefts on j.LeftId equals l.Id
join r in dbContext.Rights on j.RightId equals r.Id
join s in dbContext.Satellites on l.Id equals s.LeftId
where s.Name == "Hubble"
select new Joinder
{
Left = l,
Right = r,
Left.Satellites = ...?
};
这似乎不起作用,因为我似乎无法在自动初始化程序中取消引用这些属性名称。
有人知道怎么做吗?本质上,我想搜索“实体框架多对多深度负载”,但我想不是每个人都会像我这样说它。