1

这可能很简单,但不幸的是,我很难将带有“In”条件的 SQL 查询转换为 lambda。

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

有什么办法可以转换这个吗?

4

5 回答 5

4

为了清楚起见,您可以在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

于 2013-05-16T06:58:49.653 回答
3

这是未经测试的(出于明显的原因),但您可以尝试:

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 都提供了传递机制。

于 2013-05-16T06:56:49.180 回答
1

如果您使用的是实体框架 6 之前的版本并且.Contains()它本身不受支持:

对 Enumerable.Contains 的本机支持

于 2013-05-16T07:02:56.540 回答
1

您可以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 查询

于 2013-05-16T06:56:38.380 回答
0

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

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));
于 2013-05-16T11:05:41.903 回答