使用"In"转换SQL查询;条件转换为Lambda表达式

本文关键字:quot 转换 Lambda 表达式 条件 查询 In 使用 SQL | 更新日期: 2023-09-27 18:13:55

这可能很简单,但不幸的是,我在将带有" in "条件的SQL查询转换为lambda时遇到了困难。

SELECT * 
FROM cm_wfapp 
WHERE recgid IN (select distinct wfapp_id from cm_wftrn where approver_id = 32060)

有办法转换这个吗?

使用"In"转换SQL查询;条件转换为Lambda表达式

为了清楚起见,您可以在LINQ中执行2个查询。请记住,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)); 

这个应该产生最优的结果,但是您需要针对真实的DB和它的数据测试它,看看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提供直通机制。

您可以为您的子查询获得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查询

如果您使用的是实体框架版本6和.Contains()之前,它是不原生支持的:

Enumerable的本地支持。包含

您可以像这样构建自己的扩展方法:

http://geekswithblogs.net/EltonStoneman/archive/2010/07/11/where-in-style-queries-in-linq-to-entities.aspx

可以这样使用:

var result = cm_wfapp.WhereIn(wfapp_id.Where(i=>i.approver_id == 32060));