无法使用'not in(子查询)'将查询语法LINQ查询转换为方法语法

时间:2018-03-30 17:49:19

标签: c# linq .net-core

我有一个使用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();

1 个答案:

答案 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方法结果的否定。

编辑:轻微的代码更正并添加排序方法调用。