簡體   English   中英

實體框架/ LINQ:左連接defaultifempty失敗

[英]Entity Framework / LINQ: Left join defaultifempty fails

我需要在查詢中聯接5個表。 這些表中的3個必須具有關系,但是可以選擇將其中兩個連接到一個條目。

因此,我試圖像這樣對Table4Table5進行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM