我有一張發票,它可以包含稱爲軌道的項目。 InvoiceLine是連接兩者的聯結表。如果發票至少包含一首曲目,則一切正常。我想要實現的是即使不包含曲目,也要退回發票。Linq在發票不包含任何項目時返回null
我最初的代碼:
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
生產的最後一個表並不能包括所有連接的表。
我欣賞這方面的任何幫助。
在此先感謝。
您是否具有在InvoiceLines類中定義的'Track'導航屬性? – CodeNotFound
聽起來像你可以使用'左連接'https://msdn.microsoft.com/tr-tr/vstudio/ee908647.aspx#leftouterjoin – uTeisT
@CodeNotFound,是我在軌道導航屬性在InvoiceLines – superfly71