2013-07-15 69 views
0

我想在LINQ to改写这个简单MS SQL查询SQL:的LINQ to SQL LEFT JOIN(或陈述)

SELECT * FROM Table1 T1 
    LEFT JOIN Table2 T2 ON T1.ID = T2.Table1ID OR T1.FirstName = T2.FirstName 

如何重写这个中的LINQ to SQL?

+0

重复:http://stackoverflow.com/questions/695506/linq-left -join-group-by-count – Max

+1

它不重复,看看只有一个条件加入 – user746499

+1

http://msdn.microsoft.com/en-us/library/bb399403.aspx? – Sklivvz

回答

3

试试这个,虽然我不知道LINQ到SQL如何将它传送:

from t1 in ctx.Table1 
from t2 in ctx.Table2 
       .Where(t => t1.ID == t.Table1ID || 
          t1.FirstName == t.Firstname) 
       .DefaultIfEmpty() 
select new {t1, t2} 
+0

你可以混合Linq lambda与常规Linq查询吗?这是非常酷的东西。尽管我的大脑很伤心看着它。 – MiniRagnarok

+0

是的,谢谢@D Stanly – user746499

0

我不相信这样做是可以做到的,因为我认为你不能完成连接的OR部分。你这样做的方式在L2S加入将(大致)

join .. on 
new { 
    T1.ID, 
    T1.FirstName 
} equals new { 
    T2.Table1ID, 
    T2.FirstName 
} 

但这样会同时匹配。

我认为你可以做的唯一事情就是在那里做某种子查询。但这可能不是你想要的。 Sklivvz的建议可能是最好的。

0

这是一个内部连接。

from t1 in ctx.Table1 
from t2 in ctx.Table2 
where t1.ID == t2.Table1ID || 
     t1.FirstName == t2.Firstname 
select t1 

为了得到一个左连接,它看起来像你使用DefaultIfEmpty(),每MSDN

from t1 in ctx.Table1 
from t2 in ctx.Table2.DefaultIfEmpty() 
where t1.ID == t2.Table1ID || 
     t1.FirstName == t2.Firstname 
select t1 
+0

我认为这将导致一个' INNER JOIN',不是'LEFT JOIN' –

+0

@Dananley错过了。是啊,你说得对。 – MiniRagnarok

+0

这是交叉加入,我测试了它 – user746499