您可以在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
了。另一方面,Users
和Proposal_Minions
上的外部連接將打敗他們的過濾器用途,因爲無論如何將全部選擇Proposals
。對於Proposal_Minions
上的外連接,情況仍然如此。
我不認爲這是可能的使用LINQ。 – MarcinJuraszek
它是否必須是LINQ?如果需要(通常爲了更好的性能),您可以針對您的DBconext執行原始SQL。 –
使用LINQ代替SQL是一種糟糕的代碼異味。即使可能,你也不應該使用LINQ。 EF或Linq to SQL是ORM,而不是SQL語言的替代品。除非您的查詢表和結果整齊地映射到類,否則最好寫一個適當的SQL語句。 –