子查询在LINQ语句的Where子句中

所以我试图按照这个例子在这个LINQ查询的where子句中有一个子查询。

var innerquery =
    from app in context.applications
    select new { app.app_id };

IEnumerable<postDatedCheque> _entityList = context.postDatedCheques
    .Where(e => innerquery.Contains(e.appSancAdvice.application.app_id));

目标是从应用程序表中具有app_id的postDatedCheques中选择这些记录。

但是我在where子句中遇到了以下错误:

  • 代表'System.Func'不带1个参数
  • 无法将lambda表达式转换为类型'string',因为它不是委托类型
  • 'System.Linq.IQueryable'不包含'Contains'的定义,并且最佳扩展方法重载'System.Linq.ParallelEnumerable.Contains(System.Linq.ParallelQuery,TSource)'有一些无效参数
  • 实例参数:无法从“System.Linq.IQueryable”转换为“System.Linq.ParallelQuery”
  • 我编码错了什么?


    我认为一个简单的加入就可以完成这项工作。 它会过滤出没有相对“应用”的“检查”:

      var _entitylist = 
        from cheque in context.postDatedCheques
        join app in context.applications on cheque.appSancAdvice.application equals app
        select cheque;
    

    编辑:

    使用.Contains(...)解决方案将被转换为SQL IN语句。 这将是非常低效的。 Linq join被翻译成SQL INNER JOIN ,如果你的数据库模式修剪得很好(FKs,index),这是非常有效的。


    关于什么?

    IEnumerable<postDatedCheque> _entityList = context.postDatedCheques.Where(
         e => context.applications.Any(
              x => e.appSancAdvice.application.app_id == x.app_id));
    

    如果您想使用两个语句,请将第一个语句设置为表达式函数。

    Expression<Func<string, bool>> innerQuery = 
              x => context.applications.Any(y => y.app_id == x);
    
    IEnumerable<postDatedCheque _entityList = 
      context.postDatedCheques.Where(
        x => innerQuery(x.appSancAdvice.application.app_id));
    

    innerquery是一个包含app_id的匿名类型的IQueryable。
    Contains(e.appSancAdvice.application.app_id)这一行没有意义,因为e.appSancAdvice.application.app_id和匿名类型不是同一类型。

    简单地做:

    var _entityList = context.postDatedCheques
                             .Where(e => 
                                context.applications
                                       .Select(a => a.app_id)
                                       .Contains(e.appSancAdvice.application.app_id));
    
    链接地址: http://www.djcxy.com/p/75251.html

    上一篇: Subquery in Where Clause of LINQ statement

    下一篇: Autocomplete display data based on value in dropdownlist