这可能很简单,但不幸的是,我很难将带有“In”条件的 SQL 查询转换为 lambda。
SELECT *
FROM cm_wfapp
WHERE recgid IN (select distinct wfapp_id from cm_wftrn where approver_id = 32060)
有什么办法可以转换这个吗?
这可能很简单,但不幸的是,我很难将带有“In”条件的 SQL 查询转换为 lambda。
SELECT *
FROM cm_wfapp
WHERE recgid IN (select distinct wfapp_id from cm_wftrn where approver_id = 32060)
有什么办法可以转换这个吗?
为了清楚起见,您可以在LINQ
. 请记住,LINQ
具有延迟执行模型,因此实际查询将在实际请求的时刻生成。
所以你可以尝试做这样的事情:
var ids = wfapp_id.Where(i=>i.approver_id == 32060);
//after use a ids in yor final query.
var result = cm_wfapp.Where(id=>ids.Contains(id.recgid));
这应该会产生最佳结果,但您需要再次使用真实数据库及其数据对其进行测试,以查看是否LINQ
生成良好SQL
。
这是未经测试的(出于明显的原因),但您可以尝试:
var query = from app in db.wfapp
where db.wftrn.Where(x => x.approver_id==32060)
.Select(x => x.wfapp_id).Contains(app.recgid)
select app
不过,让我知道它是否有效。
或者:考虑将其编写为 SQL;大多数 ORm 都提供了传递机制。
如果您使用的是实体框架 6 之前的版本并且.Contains()
它本身不受支持:
您可以List<int>
为您的子查询获取一个,例如:
List<int> listOfWfaap_id = dbContext.cm_wftrn
.Where(r=> r.approver_id == 32060)
.ToList();
然后用于Contains
检查每个 ID,例如:
var result = dbContext.cm_wfapp
.Where(r=> listOfWfapp_id.Contains(r=> r.recgid);
您可能会看到:使用 Linq To Sql 创建 IN 查询
您可以像这样构建自己的扩展方法:
您可以像这样使用它:
var result = cm_wfapp.WhereIn(wfapp_id.Where(i=>i.approver_id == 32060));