外连接的Lambda表达式

时间:2014-06-11 20:29:44

标签: c# sql linq lambda

我想为

写一个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 });

2 个答案:

答案 0 :(得分:1)

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}))
    //...

就个人而言,这样的查询需要传播从以前的操作投射的信息"过去"另一种操作在查询语法方面往往比方法语法更清晰,因为这里需要方法语法不断地将所有内容投射到匿名类型中,并保留所有数据。

答案 1 :(得分:1)

听起来像一个简单的Where条款:

db.Collectors.Where(c => !db.Files.Any(f => f.CollectorCode == c.CollectorCode));

我在内部查询中使用Any,因此它将会短路"找到匹配时可能有一种更有效的方法,但这可行。