【问题标题】:How to apply Right Outer Join using LINQ in C#?如何在 C# 中使用 LINQ 应用右外连接?
【发布时间】: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 查询那样工作。

【问题讨论】:

    标签: c# sql-server linq linq-to-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{};
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-25
          • 2012-12-08
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 2021-02-11
          相关资源
          最近更新 更多