因此,我尝试按照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子句中跟随错误:
我的编码错误是什么?
答案 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));