[英]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.