簡體   English   中英

外連接的Lambda表達式

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

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