2013-04-05 65 views
2

我移植一些SQL存儲過程的邏輯,這將返回多個表中的數據集,對實體框架的強類型對象,使用LINQ查詢。選擇性LINQ的孩子包括兩層深

基本上我需要來自表A,B和C的數據,其中C有一個外鍵給B,而B有一個外鍵給A.但我不希望每個C都帶有一個FK到B,只是C'S具有一定的約束X.

所以基本上,存儲的過程基本上可以說

TableA = select from A where A.AID = AIDPassedIn 
TableB = select from B where B.AID = AIDPassedIn 
TableC = select from TableB where TableB.XID = XIDPassedIn 
return new DataSet(TableA, TableB, TableC); 
//yes this is gross and confusing, thus our current efforts 

實體框架幾乎使這個超級簡單,像這樣

A.Include("B.C").Where(a => a.AID == AIDPassedIn) 

我唯一的問題是這不包括C表上的約束X.我讀過一大堆文章,但是我讀過的所有東西都提示了我可以添加到where子句中的東西,並且這將過濾我最終得到的A對象。不管它的孩子的屬性如何,我只能得到一個A對象。我想要的是A與AIDPassedIn,所有它的孩子B和所有B的孩子C匹配約束X.

我覺得這是我有史以來最糟糕的短語之一,但我有點一個塊。任何幫助將非常感謝!

回答

1

,您可以嘗試沿着下面的幾行:

var AList = context.As.Where(a => a.AID == AIDPassedIn) 
    .Select(a => new 
    { 
     A = a, 
     Bs = a.Bs, 
     Cs = a.Bs.Select(b => b.Cs.Where(c => c.XID == XIDPassedIn)) 
    }) 
    .AsEnumerable() 
    .Select(x => x.A) 
    .ToList(); // or SingleOrDefault if AIDPassedIn is the PK 

實體框架會自動把對象圖一起(即使不使用Include),只要您不要禁用更改跟蹤。

+0

哇!我插入了A B和C的所有表名,並且它在第一次就像魔術一樣工作!這正是我需要的!非常感謝你的簡單明確的答案! – GimpCoder 2013-04-10 20:44:26