我想为
写一个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 });
答案 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
,因此它将会短路"找到匹配时可能有一种更有效的方法,但这可行。