2014-03-19 26 views
2

IHAC在可能的情況下優先考慮實體框架,現有的數據庫(因此更改模式已不存在問題)。我試圖得到一個給定一個ID的唯一E元素列表。我是MS Entities的新手,並不是我將如何處理它(我認爲對於這個小組正在做的一些複雜的事情,他們比冰上的鼻涕還要慢),但是這是我交給我的。實體框架 - 1到...多到1選擇

下面是一個quickie圖: db example diagram 這不是我的數據庫設計!別開槍提問:)

這裏的SQL我會寫:

SELECT E.e_Id, E.e_Name 
FROM 
    A, 
    B, 
    C, 
    D, 
    E 
WHERE 
    A.a_Id = 'someid' 
    AND A.a_Id = B.a_Id 
    AND B.b_Id = C.b_Id 
    AND C.d_Id = D.d_Id 
    AND D.e_Id = E.e_Id 
GROUP BY E.e_Id, E.e_Name 

逐步,我可以得到表d實體,但我無法弄清楚如何獲得E實體:

 var bLocal = context.AEntities 
      .Where(a => a.a_Id == 'someid') 
      .Select(b => b.B); 

     var dLocal = bLocal 
      .SelectMany(b => b.D); 

     var eLocal = dLocal. ???? 
       - OR? - 
     var eLocal = context.EEntities ??? 
+0

您可以使用查詢語法在linq中的一個語句中執行多個froms。 '從table1中的t1到表2中的t2'等。 – Silvermind

+0

@Silvermind,他只是使用舊式SQL89格式化他的SQL連接而不是內部連接(SQL92),而不是創建笛卡爾積。 – paqogomez

+0

@rcarver,我的答案工作?你還有其他問題嗎? – paqogomez

回答

2

你翻譯成SQL LINQ是非常直截了當:

var results = (from a in A 
       join b in B on a.a_Id equals b.a_Id 
       join c in C on b.b_Id equals c.b_Id 
       join d in D on c.d_Id equals d.d_Id 
       join e in E on d.e_Id = e.e_Id 
       where a.a_Id == 'someid' 
       group e by new { e.e_Id, e.e_Name } 
       select e) 

如果你想做到這一點應該是這樣的一個方法鏈:

var results = (A.Join(B, a => a.a_Id, b => b.a_Id, (a, b) => new {a, b}) 
    .Join(C, @t => b.b_Id, c => c.b_Id, (@t, c) => new {@t, c}) 
    .Join(D, @t => c.d_Id, d => d.d_Id, (@t, d) => new {@t, d}) 
    .Join(E, @t => d.e_Id = e.e_Id, e => , (@t, e) => new {@t, e}) 
    .Where(@t => a.a_Id == 1) 
    .GroupBy(@t => new {e.e_Id, e.e_Name}, @t => e) 
      select e) 

個人。我會堅持查詢語法。充分披露,ReSharper做了方法鏈轉換,所以它有可能更漂亮。

+0

Where is the where?(A.a_Id =='someid')' – Kevin

+0

客戶沒有使用LINQ :(我並不都熟悉EF/Linq,但是從我在實體模型中可以看到的關係表C沒有直接表示,它通過導航屬性間接表示。所以我沒有看到我怎麼能夠做到這一點LINQ查詢。 – rcarver

+0

@rcarver如果你可以做到這一點sql,你可以在linq中完成,如果' C'剛剛被鏈接了..說'B'你不需要做'C'加入。只需在該位置的「B」加入限制即可。 '&& b。 .c_Id == d.c_Id' – paqogomez

0

是否存在所有導航屬性?即你能用dLocal.E導航嗎?如果沒有,請使用context.EEntities.Where(e => e.e_Id == dLocal.e_Id)(可能使用Single())。

+0

好吧,那就是它破壞的地方。關係在那裏,但是我有很多D,我想要很多E,但只有唯一的(因此分組) – rcarver