您可以在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语句。 –