linq中的左外连接

Posted

技术标签:

【中文标题】linq中的左外连接【英文标题】:Left outer join in linq 【发布时间】:2011-04-27 15:07:09 【问题描述】:

我有以下查询,但我不知道如何在表 1 上进行左外连接。

var query = (from r in table1
             join f in table2
                 on r.ID equals f.ID
             select new
                  
                 r.ID, 
                 r.FirstName,
                 r.LastName,
                 FirstNameOnRecord = 
                     (f != null ? f.FirstName : string.Empty),
                 LastNameOnRecord = 
                     (f != null ? f.LastName : string.Empty),
                 NameChanged = 
                     (f != null 
                         ? (f.FirstName.CompareTo(r.FirstName) == 0 
                             && f.LastName.CompareTo(r.LastName) == 0) 
                         : false)
             ).ToList();

【问题讨论】:

The .NET Standard Query Operators 对我来说非常有用,因为我几年前开始使用 linq。该链接包含大量示例和定义(您需要仔细阅读“加入”部分,特别是 GroupJoin)。 【参考方案1】:

请参阅 this 或 this 示例以了解更多信息,您的情况可能是这样的-

var query = from r in table1
            join f in table2
            on r.ID equals f.ID into g
            from f in g.DefaultIfEmpty()
             select new
                  
                r.ID
                , r.FirstName
                , r.LastName
                , FirstNameOnRecord = (f != null ? f.FirstName : string.Empty)
                , LastNameOnRecord = (f != null ? f.LastName : string.Empty)
                , NameChanged = (f != null ? (f.FirstName.CompareTo(r.FirstName) == 0 
                &&  f.LastName.CompareTo(r.LastName) == 0) : false)
              ).ToList();

【讨论】:

【参考方案2】:

这是left outer join 的详细分类。

【讨论】:

【参考方案3】:

你见过these examples吗?您可能对 this part 感兴趣,了解 Linq 中的 Left Outer Join。

【讨论】:

【参考方案4】:

使用 lambda 表达式

db.Categories    
  .GroupJoin(
     db.Products,
     Category => Category.CategoryId,
     Product => Product.CategoryId,
     (x, y) => new  Category = x, Products = y )
  .SelectMany(
     xy => xy.Products.DefaultIfEmpty(),
     (x, y) => new  Category = x.Category, Product = y )
  .Select(s => new
  
     CategoryName = s.Category.Name,     
     ProductName = s.Product.Name   
  )

【讨论】:

以上是关于linq中的左外连接的主要内容,如果未能解决你的问题,请参考以下文章

Linq中的lambda /方法语法中的左外连接[重复]

csharp LINQ中的左外连接

Linq中的左外连接

LINQ:具有多个条件的左外连接

将两个查询的左外连接转换为 LINQ

使用 Linq to Sql 的左外连接结果问题