C#左外部联接将查询转换为方法语法,默认特定类型对象?
我正在尝试将我的查询语法转换为Lambda,我在这里查看了几个线程,其中一些线程: 我仍然不知道如何实现我想要的C#左外部联接将查询转换为方法语法,默认特定类型对象?,c#,linq,C#,Linq,我正在尝试将我的查询语法转换为Lambda,我在这里查看了几个线程,其中一些线程: 我仍然不知道如何实现我想要的 var suppliersAndBuyers = from s in suppliers orderby s.District join b in buyers on s.District equals b.District into buyersGroup
var suppliersAndBuyers = from s in suppliers
orderby s.District
join b in buyers on s.District equals b.District into buyersGroup
select new
{
SupplierName = s.Name,
s.District,
Buyers = buyersGroup.DefaultIfEmpty(
new Buyer()
{
Name = "No one here",
District = "I dont exist",
})
};
这是我的linq查询,它工作得很好,每个供应商都有自己的买家组,而那些没有买家的供应商只需获取我在DefaultIfEmpty方法中创建的默认买家对象
我尝试使用方法语法执行以下操作:
var leftOuterJoinBuyer = suppliers.GroupJoin(
buyers,
s => s.District,
b => b.District,
(s, buyersGroup) => new
{
s.Name,
s.District,
Buyers = buyersGroup
})
.SelectMany(s => s.Buyers.DefaultIfEmpty(new Buyer() { Name = "No name", District = "No place", }),
(s, b) => new
{
SupplierName = s.Name,
Buyers = s.Buyers,
s.District
}
);
这两种方法都返回完全相同的类型,但是我没有得到我的不匹配供应商的默认对象,那些匹配的供应商会被多次添加到最终结果中
例如,Harrison在最终集合中添加了3次买家的完全相同集合,基本上有3次相同的结果是不需要的,并且在我的查询语法中没有生成。截图->
重写此查询的正确方法是什么?这是lambda版本:
var lambdaQuery = suppliers.GroupJoin(buyers, s => s.District, b => b.District,
(s, buyersGroup) => new {
SupplierName = s.Name,
s.District,
Buyers = buyersGroup.DefaultIfEmpty(new Buyer() { Name = "No one here", District = "I don't exist" })
});
因此,没有必要像线程中的其他示例那样使用SelectMany,它们会生成一个全新的对象。
GroupJoin
包含了我所看到的与您的查询理解版本相匹配的SelectMany
的需要。