【问题标题】:Trouble converting a Query Syntax LINQ query using a 'not in (subquery)' into Method Syntax无法将使用“不在(子查询)”的查询语法 LINQ 查询转换为方法语法
【发布时间】:2018-03-30 17:49:18
【问题描述】:

我有一个使用 query syntax 的有效 LINQ 查询,我正在修改以使用 method syntax,并且在弄清楚如何在 method syntax 版本中实现类似 SQL not in (subquery) 的语句时遇到困难。

任何指针?谢谢!

查询语法 - 有效:

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();

方法语法:

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(//cant figure out the not in (subquery) portion)

  .ToListAsync()

【问题讨论】:

  • 鉴于您已经有了工作代码,与 SO 相比,这可能更适合 codereview,除非有特定原因您不能保持代码原样?
  • @user2366842 我认为它属于语法转换,而不是改进。在代码审查中,我会问Contains 的递归查询是否优于GroupBy/Count() == 1

标签: c# linq .net-core


【解决方案1】:

您需要做的就是在您的子查询中调用.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方法结果的否定。

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

【讨论】:

  • await 后面需要一个空格。此外,您需要在子查询中使用Contains(r.fooId)
  • 感谢您的指导!得到你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多