从左连接中选择时出现NullReferenceException

Sca*_*car 6 c# sql linq join

我想做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
Run Code Online (Sandbox Code Playgroud)

在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
            };
Run Code Online (Sandbox Code Playgroud)

我正进入(状态

你调用的对象是空的.

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

Gil*_*een 4

意味着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
        };
Run Code Online (Sandbox Code Playgroud)

另请参阅?.在您的select new