从左联接中选择时出现空引用异常

本文关键字:引用 异常 选择 | 更新日期: 2023-09-27 17:57:19

我正在尝试做 2 个左连接。我已经在 SQL 服务器中测试了查询并且它可以工作,但我无法在 linq 中重新创建查询。

查询:

select Master.InvoiceId,Consumer.ConsumerId,ConsumerCharge.ChargeId , Amount 
from Master 
left outer join  Consumer on 
Master.InvoiceId=Consumer.InvoiceId 
left outer join ConsumerCharge on 
Consumer.ConsumerId = ConsumerCharge.ConsumerId and 
Consumer.InvoiceId = ConsumerCharge.InvoiceId and 
Master.InvoiceId = ConsumerCharge.InvoiceId
order by InvoiceId

在 LINQ 中:

var query = from m in IM.GetMaster()
            join co in CM.GetConsumers()
            on m.InvoiceId equals co.InvoiceId into temp2
            from co in temp2.DefaultIfEmpty()
            join ch in CCM.GetCharge()
            on new { co.InvoiceId, co.ConsumerId,  } equals new { ch.InvoiceId, ch.ConsumerId }   into temp
            from ch in temp.DefaultIfEmpty()
            orderby m.InvoiceId
            select new
            {
                InvioceID = m.InvoiceId,
                ConsumerID = co == null ? 0 : co.ConsumerId,
                ChargeID = ch == null ? 0 : ch.ChargeId,
                Amount = ch == null ? 0 : ch.Amount
            };

我正在得到

对象引用未设置为对象的实例。

在第 on new { co.InvoiceId, co.ConsumerId, } 行 .如果我删除into temp2 from co in temp2.DefaultIfEmpty(),它会显示,但不显示没有任何消费者 ID 的发票 ID。如何在涉及 3 个表的情况下进行正确的左连接?

从左联接中选择时出现空引用异常

具有left join意味着如果第二个表中没有匹配的记录,则所有这些值都将null(与它不会从左侧表返回记录的正常join不同)。您可能co等于该记录的null,因此您必须检查它

试试这个:

var query = from m in IM.GetMaster()
        join co in CM.GetConsumers()
        on m.InvoiceId equals co.InvoiceId into temp2
        from co in temp2.DefaultIfEmpty()
        join ch in CCM.GetCharge()
        on new { co?.InvoiceId, co?.ConsumerId,  } equals new { ch?.InvoiceId, ch?.ConsumerId }   into temp
        from ch in temp.DefaultIfEmpty()
        orderby m.InvoiceId
        select new
        {
            InvioceID = m.InvoiceId,
            ConsumerID = co?.ConsumerId,
            ChargeID = ch?.ChargeId,
            Amount = ch?.Amount
        };

另请参阅select new?.的使用