使用 Lambda 语法的 C# LINQ Multiple GroupJoin

001*_*014 3 c# linq left-join

我有 3 个表,我试图使用左连接将它们组合在一起。在我的应用程序中,所有 LINQ 表达式都是查询链格式(lambda 表达式)。

我想弄清楚如何使用 LINQ 完成这个查询;

这是我的 SQL 查询;

select i.INVOICE_NUMBER, ic.CustomerName, o.BusinessUnit
from Invoices_Daily as i
left join intercompany as ic on i.customer_number = ic.customernumber
left join ordertypes as o on i.LINE_ORDERTYPE = o.OrderType
Run Code Online (Sandbox Code Playgroud)

我试过GroupJoin如下组合;

var commissions = data
    .GroupJoin(genericNameList,
        d => d.CUSTOMER_NUMBER,
        g => g.CustomerId,
        (d, g) => new { d, generic = g.FirstOrDefault() })
    .GroupJoin(intercompanies,
        dd => dd.d.CUSTOMER_NAME,
        i => i.CustomerId,
        (d, i) => new { data = d.d, intercompanies = i.FirstOrDefault() })
    .Select(_ => new MainGridViewModel
    {
        INVOICE_DATE = _.d.INVOICE_DATE,
        EndCustomer = _.generic == null ? _.d.CUSTOMER_NAME : _.generic.EndCustomer ?? _.d.CUSTOMER_NAME,
        LINE_ORDERTYPE = _.i.OrderType
    })
    .ToList();
Run Code Online (Sandbox Code Playgroud)

但是我有一个写在下面的语法错误;

错误 CS0411 无法从用法推断方法“Enumerable.GroupJoin(IEnumerable, IEnumerable, Func, Func, Func, TResult>)”的类型参数。尝试明确指定类型参数。

joh*_*y 5 6

我根据请求编写了一个测试示例,显示了正确的语法,这应该都有效。

public class Data
{
    public string CUSTOMER_NUMBER { get; set; }
    public string CUSTOMER_NAME { get; set; }
}

public class NameList
{
    public string CustomerId { get; set; }

}

public class InterCompanies
{
    public string CustomerId { get; set; }
}

public class Test
{
    public void TMP()
    {
        var data = new List<Data>();
        var genericNameList = new List<NameList>();
        var intercompanies = new List<InterCompanies>();

        var commissions = data
            .GroupJoin(genericNameList,
                d => d.CUSTOMER_NUMBER,
                g => g.CustomerId,
                (d, g) => new { d, generic = g.FirstOrDefault() })
            .GroupJoin(intercompanies,
                dd => dd.d.CUSTOMER_NAME,
                i => i.CustomerId,
                (d, i) => new { data = d.d, intercompanies = i.FirstOrDefault() })
            .ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

我最初的想法是您 CUSTOMER_NUMBER 和 CUSTOMER_NAME 是错误的,因为为什么您在同一个类中有 2 个字段具有相同的值。但是既然你向我保证他们是正确的,也许你正在交换联接中数据的预期字段的顺序,如果没有看到你的数据模型就很难判断。

也许你的第二次加入应该是这样的:

.GroupJoin(intercompanies,
            dd => dd.d.CUSTOMER_NUMBER,
            i => i.CUSTOMER_NAME,
Run Code Online (Sandbox Code Playgroud)