使用Lambda语法的C#LINQ多组联接



我有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

我尝试将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();

然而,我有一个语法错误,写在下面;

错误CS0411无法根据用法推断方法"Enumerable.GroupJoin(IEnumerable、IEnumeraable、Func、Func,TResult>("的类型参数。请尝试显式指定类型参数。

我根据请求编写了一个测试样本,显示了正确的语法,这一切都应该正常。

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();
}
}

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

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

.GroupJoin(intercompanies,
dd => dd.d.CUSTOMER_NUMBER,
i => i.CUSTOMER_NAME,

最新更新