我有一个使用query syntax
的LINQ查询,我正在努力使用method syntax
,并且很难弄清楚如何在{{中找到类似SQL not in (subquery)
的语句1}}版本。
任何指针?谢谢!
查询语法 - 这有效:
method syntax
方法语法:
Foo = await(
from foo in _context.foo
where foo.pid == PId
&& !DraftStatusExceptionList.Contains(foo.Stat)
&& (foo.Csstat != "UNK" || !String.IsNullOrEmpty(foo.Csstat))
//Below is the segment that I cannot figure out how to convert to method syntax:
&& !(
from recursiveJoinFoo in _context.foo
where recursiveJoinFoo.pid == PId
select recursiveJoinFoo.fooId
).Contains(foo.fooId)
orderby foo.Sdate, foo.Sdate2, foo.recordlocator
select foo
).
ToListAsync();
答案 0 :(得分:3)
您需要做的就是在子查询上调用.Contains
方法,就像在查询语法中一样:
Foo = await _context.foo
.Where(r => r.pid == PId)
.Where(r => !DraftStatusExceptionList.Contains(r.Stat))
.Where(r => r.Csstat != "UNK" || !String.IsNullOrEmpty(r.Csstat))
.Where(r => !_context.foo
.Where(rr => rr.pid == PId)
.Select(rr => rr.fooId)
.Contains(r.fooId))
.OrderBy(r => r.Sdate)
.ThenBy(r => r.Sdate2)
.ThenBy(r => r.recordlocator)
.ToListAsync();
在上一次Where
方法调用中,您将从数据库中取出一些与条件匹配的fooIds
到新集合中,然后根据它检查主集合的元素。
请注意子查询中使用的新变量名rr
,以区分查询和子查询中的元素,以及.Contains
方法结果的否定。
编辑:轻微的代码更正并添加排序方法调用。