Bog*_*ets 0 c# linq linq-to-sql
我需要在 LINQ 中编写以下 T-SQL:
SELECT T1.ID, T2.Name
FROM T1
LEFT JOIN T2 ON (T1.ID = I2.ID1 OR T1.ID = T2.ID2)
Run Code Online (Sandbox Code Playgroud)
OR 连接在 LINQ 中如下所示:
T1.Join(T2, t1=>new{}, t2=>new{}, (t1,t2)=>new{ID=t1.Id, t2=t2}).Where(o=>o.Id == o.t2.Id1 || o.Id==o.t2.Id2);
Run Code Online (Sandbox Code Playgroud)
但该查询是 INNER JOIN,而不是 LEFT JOIN。某种 LEFT JOIN 看起来像这样:
T1.GroupJoin(T2, t1 => t1.Id, t2 => t2.Id1, (t1, t2) => new { Id = t1.Id, Name1 = t2.Select(t => t.Name) }).DefaultIfEmpty()
.GroupJoin(T2, o => o.Id, t2 => t2.Id2, (i, j) => new { Id = i.Id, Name1 = i.Name1, Name2 = j.Select(t => t.Name) }).DefaultIfEmpty();
Run Code Online (Sandbox Code Playgroud)
这个查询产生了正确的结果,但产生了 2 个连接而不是 1 个。或者它真的等同于原始 T-SQL?
有人知道如何更好地重写此查询吗?
这个来自类似问题的答案为我们提供了一种简单的方法来写LEFT JOINs:https :
//stackoverflow.com/a/4739738/1869660
var query = from t1 in T1
from t2 in T2.Where(tt2 => (t1.ID == tt2.ID1) || (t1.ID = tt2.ID2))
.DefaultIfEmpty()
select new { t1.ID, t2.Name }
Run Code Online (Sandbox Code Playgroud)