![](/img/trans.png)
[英]Lambda expression in C# using Entity Framework with multiple left outer joins with in line additional filter
[英]Lambda expression for outer joins
我想寫一個lambda等價於
from col in db.Collectors
join f in db.Files
on new { col.CollectorCode, col.StatusID }
equals new { f.CollectorCode, StatusID = 1 } into f_join
from f in f_join.DefaultIfEmpty()
where
col.FileID == null
orderby
col.CollectorCode
select new {
col.CollectorCode,
col.Name
}
我有一個表收集器和表文件。 表文件為每個收集器包含多個記錄(文件),我只想檢索在表文件中沒有記錄的收集器。
我不清楚該怎么做。
這是我所擁有的,但沒有按預期工作:
db.Collectors.Join(
db.Files,
col => col.CollectorCode,
f => f.CollectorCode,
(col, f) => new { Collector = col });
join ... into
查詢語法代碼對應於GroupJoin
而不是Join
。
db.Collectors.GroupJoin(
db.Files,
col => col.CollectorCode,
f => f.CollectorCode,
(col, f_join) => new { col, f_join })
第一個之后的from
子句將對應於SelectMany
:
db.Collectors.GroupJoin(...)
.SelectMany(join => join.f_join.DefaultIfEmpty().Select(f => new{join.col, f}))
//...
就個人而言,對於這樣的查詢,它需要傳播從過去操作“過去”投射的信息,而另一種操作在查詢語法中通常比方法語法更清晰,這是由於此處的方法語法需要不斷地將所有內容投射到匿名類型中保留所有數據。
聽起來像一個簡單的Where
子句:
db.Collectors.Where(c => !db.Files.Any(f => f.CollectorCode == c.CollectorCode));
我在內部查詢中使用Any
,因此當找到匹配項時它將“短路”。 可能有一種更有效的方法,但這會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.