c# - 当发票不包含任何项目时,Linq 返回 null

标签 c# entity-framework linq asp.net-web-api

我有一张发票,它可以包含称为轨道的项目。 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"
};

如果包含任何轨道,以上将正确返回发票和轨道。

Invoice contains at least one track

基本上上面的代码是一个内部连接,所以如果没有轨道,结果集将为空。所以我更正了我的代码以包含发票,即使它不包含轨道。

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"
};

但是我得到一个空的结果:

Empty result

我尝试使用 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/

相关文章:

c# - 我的验证器都不起作用

sql - 为什么我的导航属性在 Entity Framework 4 中为空?

c# - 如何使用 LINQ 从 Dictionary<string,List<string>> 中删除任何值

林克 |如何在不分组的情况下获得 SUM?

c# - 检查 null 返回的项目

c# - MVC Controller 的方法不返回 View

c# - 修改 Windows 登录屏幕

c# - 解码 DNS header

c# - 在反射(reflect)的导航属性上添加排序

c# - 为什么 Include 没有任何效果?