![](/img/trans.png)
[英]LINQ Left Join SQL equivalent via DefaultIfEmpty fails to return results
[英]Entity Framework / LINQ: Left join defaultifempty fails
我需要在查詢中聯接5個表。 這些表中的3個必須具有關系,但是可以選擇將其中兩個連接到一個條目。
因此,我試圖像這樣對Table4
和Table5
進行LEFT JOIN
:
var cDesc = (cDesc == null ? "" : cDesc);
var cStreet = (cStreet == null ? "" : cStreet);
var q = await (from t1 in MyContext.Table1
join t2 in MyContext.Table2
on t1.ID equals t2.ObjectID
join t3 in MyContext.Table3
on t2.TeamID equals t3.TeamID
join t4 in MyContext.Table4
on t1.ID equals t4.ObjectID
into join3
from j3 in join3.DefaultIfEmpty()
join t5 in MyContext.Table5
on j3.StorageID equals t5.StorageID
where t2.ObjectType.Equals(16)
&& t3.UserID.Equals(userID)
&& t1.Description.Contains(cDesc)
&& l.Address.Contains(cStreet)
orderby t1.ID descending
select new Table1ListModel
{
ID = t1.ID,
Description = t1.Description,
Address = t5.Address
}
)
.Take(takeThis)
.ToListAsync();
但是此查詢僅適用於與Table4
有連接的行,因此我顯然做錯了。
我是否正確進行了加入? 還是我要在第五張表上的地址上運行where
的問題?
基本上,一旦將一個表連接到查詢中,幾乎所有要連接到該表的其他表都應該幾乎總是用左連接完成。 在您的情況下,您說要保留Table1中沒有匹配項的表1中的行,但是然后您說您只希望Table4和Table5之間的匹配項,這將基本上刪除所有不匹配的Table1結果在表4中。 基本上你想要這樣的東西
from j3 in join3.DefaultIfEmpty()
join temp5 in MyContext.Table5
on j3.StorageID equals temp5.StorageID into join4
from t5 in join4.DefaultIfEmpty()
這看起來像是您的問題的根源:
join t4 in MyContext.Table4
on t1.ID equals t4.ObjectID
into join3
這意味着您正在內部將Table4連接到Table1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.