我想做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个表的情况下进行正确的左连接?
意味着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