簡體   English   中英

EF Core,左外加入或條件

[英]EF Core, Left Outer Join With Or Condition

我想像這樣為 SQL 編寫一個 EF 查詢

select *
from Table1 t1
left outer join t2 on (t1.id = t2.ParentId or t1.id2 = t2.ParentId2) 

所以我返回所有 t1 行,在 t2 的任一條件下都匹配,但如果兩個條件都不匹配,則返回 t1。 如果它是 AND 條件,EF 可以支持這一點,但對於 OR,大多數人在 Where 子句而不是 Join 條件中執行此操作。 但是,如果我這樣做,則只返回匹配的行,而不是 t1 中的不匹配行

例如,作為一個 AND 條件,它很容易做到

   var result = from t1 in db.Table1s
                join t2 in db.Table2s on new {t1.id, t1.id2} equals new {t2.parentId, t2.parentId2}
                     into t2join
                from t2 in t2join.DefaultIfEmpty() 

為了說明,這可以寫為交叉連接,但不返回不匹配的 t1 行

   var result = from t1 in db.Table1s
                from t2 in db.Table2s
                where t1.id == t2.parentId || t1.id2 == t2.parentId2 || t}

所以我需要使用第一種語法,但是如何使用 OR 子句來做到這一點? 所以理想情況下,我想要類似的東西

 var result = from t1 in db.Table1s
                join t2 in db.Table2s on t1.id == t2.parentId || t1.id2 == t2.parentId2 
                     into t2join
                from t2 in t2join.DefaultIfEmpty() 

我看不出用普通的 LINQ 到 SQL 查詢來實現這一點(很高興被證明是錯誤的)。 我看到的唯一方法是直接從 EF 調用 SQL 這就是我使用 FromSqlInterpolated 實現的方法

首先,我需要一個新的 EF model 來保存我的結果集,但我不想要一個新表。 這是通過在我的 DbContext 中為 ResultModel 創建一個 DbSet 然后在 OnModelCreating 中指定它 HasNoKey 以及 map 它到 null 視圖來完成的,因此不要創建表。

 public DbSet<ResultModel> ResultModelSet{ get; set; }

 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);     

            modelBuilder.Entity<ResultModel>().HasNoKey().ToView(null);
        }

然后在我的查詢中,我可以將原始 sql 和 map 運行回這個 model

  var result= await db.ResultModelSet
                .FromSqlInterpolated($@"select t1.id, t1.ida, t2.ParentId, t2.ParentId2
                                     from Table1 t1
                                     left outer join t2 on 
                                             (t1.id = t2.ParentId or 
                                              t1.id2 = t2.ParentId2)
                                        ")
                .ToListAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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