2011-05-31 147 views
1

很多搜​​索後,我無法找到一個簡單的答案,這下面的SQL語句:轉換普通SQL到LINQ到實體

SELECT t1.LoginName, t0.BNAME 
FROM USR02 AS t0 
LEFT OUTER JOIN LoginData AS t1 
    INNER JOIN Mandants AS t2 ON t1.Id_Mandants = t2.Id_Mandants 
ON t0.BNAME = t1.LoginName AND t0.MANDT = t2.CodeMandant 

由於雙ON語句,我不知道怎麼寫的在LINQ中。

我試圖簡化它,但多個主鍵使工作很難。

+1

什麼是你的方法這麼遠? – 2011-05-31 14:51:52

+0

注意事項:您的'LEFT JOIN'確實表現爲'INNER JOIN' – a1ex07 2011-05-31 15:03:18

+0

嗨,Daniel,謝謝你的幫助。 Inner連接是綁定T2表和t1,結果用於使用T0創建左外連接來查找所有無法用T0映射的LoginData行。但是我需要T0中的所有行。 – Markus 2011-05-31 15:24:22

回答

0

您需要將您的查詢轉換爲定期,1級加盟:

select t1.LoginName, t0.BNAME 
from USR02 as t0 
left outer join LoginData as t1 on t0.BNAME = t1.LoginName 
inner join Mandants as t2 on t0.MANDT = t2.CodeMandant and t1.Id_Mandants = t2.Id_Mandants 

那麼這將是更容易把它改寫了LINQ to實體:

from t0 in db.t0 
join t1 in db.t1 on t0.BNAME equals t1.LoginName 
join t2 in db.t2 on new { t0.MANDT, t1.Id_Mandants} equals new { t2.CodeMandant , t2.Id_Mandants } 
select new { t1.LoginName, t0.BNAME }; 
+0

嗨abatishchev,謝謝你的回答,重要的一點是我想要從USR02表中找到所有行,並找到所有的LoginData行爲null。 – Markus 2011-05-31 15:11:51

2

開始通過翻譯SQL查詢更自然。就像這樣:

SELECT t1.LoginName, t0.BNAME 
FROM USR02 AS t0 
     LEFT OUTER JOIN LoginData AS t1 
      ON t0.BNAME = t1.LoginName 
     INNER JOIN Mandants AS t2 
      ON t1.Id_Mandants = t2.Id_Mandants 
WHERE t0.MANDT = t2.CodeMandant 

現在,應該是很容易這個轉換爲LINQ。如果您已經正確設置了實體模型中的關係,則可以編寫以下LINQ查詢:

from data in db.LoginData 
where data.User.MANDT == data.Mandant.CodeMandant 
select new { data.LoginName, data.User.BNAME }; 

btw。爲什麼你輸出LoginData.LoginName作爲USR02.BNAME,因爲它們總是相等的?

+0

嗨史蒂文,謝謝你的回答。我認爲引起我的麻煩的是「ON t0.BNAME = t1.LoginName AND t0.MANDT = t2.CodeMandant」這一行很重要。 – Markus 2011-05-31 15:19:46

0

我喜歡寫作加入這樣

from t0 in db.t0 
from t1 in db.t1.Where(x => t0.BNAME == x.LoginName).DefaultIfEmpty() 
from t2 in db.t2.Where(x => t0.MANDT == x.CodeMandant) 
       .Where(x => t1.Id_Mandants == x.Mandants) 
select new { t1.LoginName, t0.BNAME };