我有一张发票,它可以包含称为轨道的项目。 InvoiceLine 是连接两者的联结表。如果发票至少包含一条轨道,则一切正常。我想要实现的是即使发票不包含轨道也可以退回发票。
我的初始代码:
var screenset =
from inv in context.Invoices where inv.InvoiceId == invoiceID
join line in context.InvoiceLines on inv.InvoiceId equals line.InvoiceId
join track in context.Tracks on line.TrackId equals track.TrackId
select new InvoiceAndItemsDTO
{
InvoiceId = inv.InvoiceId,
InvoiceDate = inv.InvoiceDate,
InvoiceTotal = inv.Total,
CustomerId = inv.CustomerId,
CustomerFullName = inv.Customer.LastName + ", " + inv.Customer.FirstName,
CustomerPhoneNumber = inv.Customer.Phone,
InvoiceLineId = line.InvoiceLineId,
TrackId = track.TrackId,
TrackName = track.Name,
TrackPrice = track.UnitPrice,
Artist = track.Album.Artist.Name,
UnitPrice = line.UnitPrice,
Quantity = line.Quantity,
Action = "None"
};
如果包含任何轨道,以上将正确返回发票和轨道。
基本上上面的代码是一个内部连接,所以如果没有轨道,结果集将为空。所以我更正了我的代码以包含发票,即使它不包含轨道。
var screenset =
from inv in context.Invoices where inv.InvoiceId == invoiceID
from j in context.Invoices where j.InvoiceId == invoiceID
join line in context.InvoiceLines on j.InvoiceId equals line.InvoiceId
join track in context.Tracks on line.TrackId equals track.TrackId
select new InvoiceAndItemsDTO
{
InvoiceId = inv.InvoiceId,
InvoiceDate = inv.InvoiceDate,
InvoiceTotal = inv.Total,
CustomerId = inv.CustomerId,
CustomerFullName = inv.Customer.LastName + ", " + inv.Customer.FirstName,
CustomerPhoneNumber = inv.Customer.Phone,
InvoiceLineId = line.InvoiceLineId,
TrackId = track.TrackId,
TrackName = track.Name,
TrackPrice = track.UnitPrice,
Artist = track.Album.Artist.Name,
UnitPrice = line.UnitPrice,
Quantity = line.Quantity,
Action = "None"
};
但是我得到一个空的结果:
我尝试使用 join into newset
并使用 from e in newset.DefaultIfEmpty()
但我加入了 3 个表并且 join into
产生最后一张表,不能包括所有连接表。
我很感激在这方面的任何帮助。
提前致谢。
最佳答案
很简单。
让我们采用原始查询
from inv in context.Invoices where inv.InvoiceId == invoiceID
join line in context.InvoiceLines on inv.InvoiceId equals line.InvoiceId
join track in context.Tracks on line.TrackId equals track.TrackId
...
生成内部连接。为了将它们变成左外部连接,您只需插入两行:
from inv in context.Invoices where inv.InvoiceId == invoiceID
join line in context.InvoiceLines on inv.InvoiceId equals line.InvoiceId
into lines from line in lines.DefaultIfEmpty() // turn the above to left join
join track in context.Tracks on line.TrackId equals track.TrackId
into tracks from track in tracks.DefaultIfEmpty() // turn the above to left join
...
参见 Left Outer Join在 MSDN 文档中。
关于c# - 当发票不包含任何项目时,Linq 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918579/