我正在尝试编写一个查询,该查询从一个数据库中获取信息并将其连接到另一个数据库中的信息。
TableA
idA
valueA
idB
TableB
idB
valueB
棘手的部分是在TableA中,idB并不总是被定义,所以当我进行普通连接时,我只得到TableA具有idB值的结果。我想要的是能够从TableA中获取所有信息,即使它没有相应的idB值。
答案 0 :(得分:5)
这是左连接的查询表达式语法版本,以跟进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
};
答案 1 :(得分:3)
通过检查右侧返回的值是否为空并为该情况提供默认值来使用左外连接。
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
});
答案 2 :(得分:0)
您可以使用SelectMany
(直接调用Queryable
方法)或在理解语法join ... into
中在LINQ中执行左外连接:
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<typeof-db-TableB>
答案 3 :(得分:0)
左连接示例:
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 };