C# 这里的原因是什么,因为我有空错误?LINQ左连接问题
我尝试执行left join操作,但没有成功请查看C# 这里的原因是什么,因为我有空错误?LINQ左连接问题,c#,linq,C#,Linq,我尝试执行left join操作,但没有成功请查看DefaultIfEmpty()调用。如果客户没有相关的包,则包集合将为空。调用DefaultIfEmpty()返回空包集合的default(null)包对象。这意味着,在调用SelectMany时,您可以在SelectMany的最后一个参数中为y获取nulls。要克服此问题,您可以使用(?。): 您还应该注意,在这种情况下,结果集合中的PackId是一个可为null的类型(可能是int?),并且对于某些结果项为null 建议:对于以下情况,查询
DefaultIfEmpty()
调用。如果客户
没有相关的包
,则包
集合将为空。调用DefaultIfEmpty()
返回空包集合的default
(null
)包对象。这意味着,在调用SelectMany
时,您可以在SelectMany
的最后一个参数中为y
获取null
s。要克服此问题,您可以使用(?。
):
您还应该注意,在这种情况下,结果集合中的PackId
是一个可为null的类型(可能是int?
),并且对于某些结果项为null
建议:对于以下情况,查询语法要简单得多:
var allCustomers = customers
.GroupJoin(
packages,
customer => customer.PackId,
packages => packages.PackId,
(customer, packages) => new { customer, packages })
.SelectMany(
y => y.packages.DefaultIfEmpty(),
(x, y) => new { CustId = x.customer.CustomerId, PackId = y?.PackId })
.ToList();
另一个注意事项:如果您针对来自ORM(例如实体框架)的IQueryable
集合编写这样的查询,您将不会得到NullReferenceException
。因为您的查询被转换为SQL并在您的DBMS上运行。您的“空错误”是什么意思?您需要准确描述您收到的错误。那里是需要的。我们不需要真正的数据或真正的表来重现问题。2具有虚假属性的对象列表重现问题。运行时y为空!我们需要查看stacktrace的完整异常
var allCustomers = customers
.GroupJoin(
packages,
customer => customer.PackId,
packages => packages.PackId,
(customer, packages) => new { customer, packages })
.SelectMany(
y => y.packages.DefaultIfEmpty(),
(x, y) => new { CustId = x.customer.CustomerId, PackId = y?.PackId })
.ToList();
var allCustomer =
(from customer in customers
join package in packages on customer.PackId equals package.PackId into g
from package in g.DefaultIfEmpty()
select new { CustId = customer.CustomerId, PackId = package?.PackId })
.ToList();