LINQ语句Where子句中的子查询

时间:2013-04-25 07:49:57

标签: c# asp.net linq entity-framework linq-to-entities

因此,我尝试按照this示例在此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子句中跟随错误:

  1. 委托'System.Func'没有 拿一个参数
  2. 无法将lambda表达式转换为'string'类型,因为它不是 代表类型
  3. 'System.Linq.IQueryable'不包含 'Contains'的定义和最佳扩展方法重载 “System.Linq.ParallelEnumerable.Contains(System.Linq.ParallelQuery, TSource)'有一些无效的论点
  4. 实例参数:无法转换 'System.Linq.IQueryable'来 'System.Linq.ParallelQuery'
  5. 我的编码错误是什么?

4 个答案:

答案 0 :(得分:5)

我认为简单的加入可以完成这项工作。它将过滤掉没有相对'app'的'支票':

  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,如果你的数据库模式被很好地修剪(FK,索引),这是非常有效的

答案 1 :(得分:4)

怎么样?

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

答案 2 :(得分:1)

请改为尝试:

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

IEnumerable<postDatedCheque> _entityList = context.postDatedCheques
    .Where(e => innerquery.Any(a => a.app_id == e.appSansAdvice.application.app_id));

答案 3 :(得分:1)

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