這可能相當簡單,但不幸的是,我很難確定將具有「In」條件的SQL查詢轉換爲lambda。將「In」條件的SQL查詢轉換爲Lambda表達式
SELECT *
FROM cm_wfapp
WHERE recgid IN (select distinct wfapp_id from cm_wftrn where approver_id = 32060)
有沒有什麼辦法可以將其轉換?
這可能相當簡單,但不幸的是,我很難確定將具有「In」條件的SQL查詢轉換爲lambda。將「In」條件的SQL查詢轉換爲Lambda表達式
SELECT *
FROM cm_wfapp
WHERE recgid IN (select distinct wfapp_id from cm_wftrn where approver_id = 32060)
有沒有什麼辦法可以將其轉換?
這是未經測試(顯而易見的原因),但您可以嘗試:
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;大多數ORMS都提供了pass-thru機制。
你可以得到一個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);
在早期查詢中調用'ToList'可能是一個壞主意,如果它阻止了組合 - 第一個查詢可能會在網絡上強制大量行。它顯然取決於上下文,儘管 –
爲了清楚起見,你可以在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));
這應該產生最佳結果,但你需要測試它agains真正的DB和它的數據,看是否LINQ
產生良好SQL
或不。
如果您正在使用實體框架前的版本6 .Contains()
它本身不支持:
你可以建立自己的擴展,方法是這樣的:
你可以這樣使用:
var result = cm_wfapp.WhereIn(wfapp_id.Where(i=>i.approver_id == 32060));
Marc在每次迭代中都會在'wftrn'中搜索'x.approver_id == 32060'? – Habib
@Habib取決於提供者是什麼; OP建議(通過提及sql)它是類似於EF/L2S的東西,在這種情況下,我希望*作爲單個組合的TSQL查詢下去;並明確*不*搜索每個「應用程序」迭代的approver_id –
在where子句之後不應該有'.Select(x => x.wfapp_id)'? – Dirk