如何在 C# 中使用 LINQ 应用右外连接?
Posted
技术标签:
【中文标题】如何在 C# 中使用 LINQ 应用右外连接?【英文标题】:How to apply Right Outer Join using LINQ in C#? 【发布时间】:2021-01-01 19:36:10 【问题描述】:我在 LINQ 中应用 Right Outer Join 时遇到问题。我正在尝试通过从 SQL 查询转换来在 LINQ 中构建类似的查询。
我正确的 SQL 查询
select *
from Table1 t1
inner join Table2 t2 on t1.Id = t2.FID and t1.CID = 20
right outer join Table3 t3 on t1.GID = t3.GID
var result = from t1 in Table1
join t2 in Table2
on t1.ID equals t2.FID into gr1
where t1.CID = 20
join t3 in Table3
on t1.GID equals t3.GID into gr2
from t3 in gr2.DefaultIfEmpty()
select new Details ()
return result.ToList();
我的 LINQ 查询没有像 SQL 查询那样工作。
【问题讨论】:
【参考方案1】:这也在这里讨论 how to make a right join using LINQ to SQL & C#
var RightJoin = from adds in dc.EmpresaAddendas
join cats in CatAddendas
on adds.IDAddenda equals cats.IDAddenda into joined
from cats in joined.DefaultIfEmpty()
select new
Id = cats.IDAddenda,
Description = cats.Descripcion
;
【讨论】:
【参考方案2】:试试这个:
var result = from t1 in Table1
join t2 in Table2
on new id = t1.ID; cid = t1.CID equals new id = t2.FID: cid = 20 into gr1
join t3 in Table3
on t1.GID equals t3.GID into gr2
from t123 in gr2.DefaultIfEmpty()
select new Details ()
return result.ToList();
【讨论】:
【参考方案3】:如您所见,大多数 LINQ 提供程序不提供对 right join
的支持。 DefaultIfEmpty 转换为LEFT join
。因此,您需要稍微翻转一下查询的逻辑,以将右连接变为左连接。
就实际语法而言,我已经成功地采用了更多的 ANSI-82 语法,而不是担心 into temp2 from temp3 in temp2
语法。大致如下:
var result =
from t3 in Table3
from t1 in Table1.Where(temp1 => temp1.GID == t3.GID).DefaultIfEmpty()
join t2 in Table2 on t1ID equals t2.FID
where t1.CID == 20
select new Details;
【讨论】:
以上是关于如何在 C# 中使用 LINQ 应用右外连接?的主要内容,如果未能解决你的问题,请参考以下文章