如何过滤嵌套关系

时间:2016-05-12 08:45:19

标签: c# .net entity-framework linq

我有三张桌子:

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被加载。

非常感谢任何帮助,谢谢。

1 个答案:

答案 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};