C# LINQ中的条件连接?

C# LINQ中的条件连接?,c#,linq,join,C#,Linq,Join,我试图编写一个查询,从一个数据库中获取信息,并将其连接到另一个数据库中的信息 TableA idA valueA idB TableB idB valueB 棘手的是,在TableA中,idB并不总是定义的,所以当我进行普通连接时,我只会得到TableA有idB值的结果。我想要的是能够从TableA中获取所有信息,即使它没有相应的idB值 通过检查从右侧返回的值是否为null并为该情况提供默认值,使用左外部联接 var q = db.TableA.Join( db.TableA,

我试图编写一个查询,从一个数据库中获取信息,并将其连接到另一个数据库中的信息

TableA
idA
valueA
idB

TableB
idB
valueB

棘手的是,在TableA中,idB并不总是定义的,所以当我进行普通连接时,我只会得到TableA有idB值的结果。我想要的是能够从TableA中获取所有信息,即使它没有相应的idB值

通过检查从右侧返回的值是否为null并为该情况提供默认值,使用左外部联接

 var q = db.TableA.Join( db.TableA,
                         a => a.idB,
                         b => b.idB,
                         (a,b) => new
                                  {
                                      A = a.ValueA,
                                      B = b == null ? null : b.ValueB
                                  });

您可以在LINQ中使用
SelectMany
(直接调用
Queryable
方法)或在理解语法
join。。。进入

var results = from a in db.TableA
              join b in db.TableB on a.idB equals b.idB
                into found
              select new {
                A = a,
                Bs = found
              };
在输出中,
Bs
将是
IEnumerable

左连接示例:

var leftOuterJoinQuery =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID into prodGroup
    from item in prodGroup.DefaultIfEmpty(new Product{Name = String.Empty, CategoryID = 0})
        select new { CatName = category.Name, ProdName = item.Name };

下面是左连接的查询表达式语法版本,以跟进tvanfosson的答案

var query = from rowA in db.TableA
            join rowB in db.TableB
            on rowA.idB equals rowB.idB into b
            from item in b.DefaultIfEmpty()
            select new
            {
                idA = rowA.idA,
                valueA = rowA.valueA,
                idB = rowA.idB, 
                valueB = item != null ? item.valueB : 0 // or other default value
            };

好的,太好了。我一直想知道左连接和连接之间的区别是什么,现在我知道了!谢谢明目张胆地复制/粘贴MSDN;)