2011-05-13 97 views
4

的多層次,我剛剛在實體框架和LINQ開始到實體和實體框架查詢我試圖讓我的身邊查詢頭。橫跨關係

我有一個數據結構如下所示:

表A,B,C。

A具有一對多的關係到B,B具有一對多的關係,以C.

一個我們的演示文稿對象由A,B的數據組成B & C給定的ID從C

所以,我該如何在查詢中表示這個?

我如何從where c.Id == myParam查詢的一個實體?

回答

4

什麼:

var c = context.Cs.Include("B.A").Where(c => c.Id == myParam).SingleOrDefault(); 

BC導航屬性的BA實例導航屬性從BA實例。

您還可以使用拉姆達符號,如果System.Data.Entity的命名空間refeneced:

var c = context.Cs.Include(i=>i.B.A).Where(c => c.Id == myParam).SingleOrDefault(); 

極具收藏導航屬性可以使用。選擇()

var c = context.Cs.Include(i=>i.Select(j=>j.A)).Where(c => c.Id == myParam).SingleOrDefault(); 
+0

完美,謝謝 – Shevek 2011-06-07 13:56:40

2

你可以試試這個:

var temp = from a in AList 
      where a.B.All(b => b.C.All(c => c.ID== myParam)) 
      select a; 

通知,AListList<A>

+0

壽hal回答l feshel hayda! !... akeed btishteghel b SETS mahek ?? – scatman 2011-05-18 13:15:11

3

下面的作品,如果你正在設法確保對象A的所有引用被加載,所以你可以訪問它們。

變種C = lstA.Where(P => p.B.FirstOrDefault()C == CID);

0

有很多方法可以做的事情與LINQ,有時我發現,如果我有一個很難試圖想出與使用現有的擴展方法的組合的解決方案,我會簡單地寫一個連接(如你會在SQL中)使用LINQ。下面的加入並不需要實際的「加入的」部分原因是EF會使用你現有的映射(導航性能)來生成連接你。

var query = from a in Ta 
      from b in Tb 
      from c in Tc 
      where C.Id == myParam 
      select new { A = a, B = b, C = c}; 

從這裏你有一個匿名類型,它有來自所有三個表的數據。最好的部分是,英孚確實自動修復你的對象,這意味着你可以從你的方法只返回A,並能夠遍歷它得到B和C.