2013-08-21 112 views
0

我有一個非常基本的SQL連接語句,我似乎無法弄清楚如何使它在LINQ中工作。它在JOIN中使用OR語句,我發現在JOIN中使用AND的代碼在線,但在我的情況下沒有任何對OR的幫助。將SQL轉換爲LINQ,並在JOIN中使用OR語句

這裏是SQL:

SELECT * 
FROM Proposals AS a 
LEFT JOIN Proposal_Minions AS b 
    ON a.ID = b.Proposal_ID 
LEFT JOIN Users AS c 
    ON (a.PI_User_ID = c.ID) OR (a.Creator_User_ID = c.ID) OR (b.User_ID = c.ID) 
WHERE c.Account = 'myname' 

任何幫助將不勝感激。

+0

我不認爲這是可能的使用LINQ。 – MarcinJuraszek

+0

它是否必須是LINQ?如果需要(通常爲了更好的性能),您可以針對您的DBconext執行原始SQL。 –

+0

使用LINQ代替SQL是一種糟糕的代碼異味。即使可能,你也不應該使用LINQ。 EF或Linq to SQL是ORM,而不是SQL語言的替代品。除非您的查詢表和結果整齊地映射到類,否則最好寫一個適當的SQL語句。 –

回答

1

您可以在join代替使用where

from a in Proposals 
join b in Proposal_Minions on a.ID equals b.Proposal_ID 
from c in Users 
where a.PI_User_ID == c.ID || a.Creator_User_ID == c.ID || b.User_ID == c.ID 
select new { a, b, c } 

然而,這將是INNER JOIN相當。您可以通過

from a in Proposals 
join b in Proposal_Minions on a.ID equals b.Proposal_ID into j 
from pm in j.DefaultIfEmpty() 
select new { a, 
      pm, 
      c = (from c in Users 
       where a.PI_User_ID == c.ID 
        || a.Creator_User_ID == c.ID 
        || pm.User_ID == c.ID 
       select c).FirstOrDefault() 
      } 

得到外連接效果要選擇Proposal唯一的,你可以做

from a in Proposals 
join b in Proposal_Minions on a.ID equals b.Proposal_ID into j 
from pm in j.DefaultIfEmpty() 
where Users.Any(u => a.PI_User_ID == u.ID 
        || a.Creator_User_ID == u.ID 
        || pm.User_ID == u.ID) 
select a 

但這不是外部聯接上Users了。另一方面,UsersProposal_Minions上的外部連接將打敗他們的過濾器用途,因爲無論如何將全部選擇Proposals。對於Proposal_Minions上的外連接,情況仍然如此。

+0

我認爲這裏有一個問題,如果b沒有條目,即使a.PI_User_ID = c.ID或a.Creator_User_ID = c.ID也不會得到結果,但是你會在原始的sql中。 –

+0

@DanKaufman你是對的!我認爲我的編輯將完成SQL的功能。 –

+0

當我在linqpad中運行第二條linq語句時,它給了我一個錯誤,說Proposal_Minions不包含User_ID的定義...是否意味着「從j.DefaultIfEmpty()中的pm」沒有從User_ID字段獲取User_ID字段Proposal_Minions表? –

1

如果需要,您可以針對數據庫上下文執行原始sql,並將結果映射到強類型(確保查詢結果與該類型匹配)。

IEnumerable<YourStronglyTypedTable> myResults = 
dbConext.ExecuteQuery<YourStronglyTypedTable>("Your SELECT query");