2013-08-21 45 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");