C#左外部联接将查询转换为方法语法,默认特定类型对象?

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

我正在尝试将我的查询语法转换为Lambda,我在这里查看了几个线程,其中一些线程:

我仍然不知道如何实现我想要的

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
的需要。