这可能很简单,但不幸的是,我在将带有" in "条件的SQL查询转换为lambda时遇到了困难。
SELECT *
FROM cm_wfapp
WHERE recgid IN (select distinct wfapp_id from cm_wftrn where approver_id = 32060)
有办法转换这个吗?
为了清楚起见,您可以在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));