2016-05-12 74 views
3

我有三個表:如何篩選嵌套關係

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

我想要做的是得到的將只有已加載BS A記錄,這將反過來被過濾,以過濾列表只返回也將被過濾的Cs列表(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所有的CS的名單,而B和A也是如此。我可以理解爲什麼會發生這種情況,但我似乎無法弄清楚如何以某種方式做到這一點,以便只有一個C被加載,並且只有那些映射到C被加載。

任何幫助將不勝感激,謝謝。

回答

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