C# 这里的原因是什么,因为我有空错误?LINQ左连接问题

C# 这里的原因是什么,因为我有空错误?LINQ左连接问题,c#,linq,C#,Linq,我尝试执行left join操作,但没有成功请查看DefaultIfEmpty()调用。如果客户没有相关的包,则包集合将为空。调用DefaultIfEmpty()返回空包集合的default(null)包对象。这意味着,在调用SelectMany时,您可以在SelectMany的最后一个参数中为y获取nulls。要克服此问题,您可以使用(?。): 您还应该注意,在这种情况下,结果集合中的PackId是一个可为null的类型(可能是int?),并且对于某些结果项为null 建议:对于以下情况,查询

我尝试执行left join操作,但没有成功

请查看
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();