我有三张桌子:
public class A
{
[Key]
public int Id {get; set;}
public virtual ICollection<B> Bs {get; set;}
}
public class B
{
[Key]
public int Id {get; set;}
public int AId {get; set;}
[ForeignKey("AId")]
public virtual A A {get;set;}
public virtual ICollection<C> Cs {get;set;}
}
public class C
{
[Key]
public int Id {get; set;}
public int BId {get; set;}
[ForeignKey("BId")]
public virtual B B {get;set;}
}
我想要做的是获取A记录的过滤列表,这些记录只会加载Bs,而这些Bs将被过滤,只返回一个也将被过滤的C列表(Cs列表)将只包括一个记录)。我知道这听起来有点混乱,但是看看我尝试过的代码会有点意义。
以下是我目前的情况:
int cId = 123;
var filtered = aRepo.GetAll() // returns dbContext.Set<A>()
.Where(a => a.Bs
.Where(b => b.Cs
.Where(c => c.Id == cId).FirstOrDefault() != null
).FirstOrDefault() != null
).ToList();
这种方法的问题是,一旦我找到了C的匹配,B就会加载一个映射到B的所有C的列表,B和A也会发生同样的情况。我可以理解为什么这是发生了,但我似乎无法弄清楚如何以某种方式做到这一点,只有一个C被加载,只有那个映射到那个C的B被加载。
非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
尝试使用JOIN获取所有三元组:
var filtered = from a in aRepo.GetAll()
join b in bRepo.GetAll() on a.Id equals b.AId
join c in cRepo.GetAll() on b.Id equals c.BId
where c.Id == cId
select new { aid= a.Id, bid= b.Id, cid = c.Id};