2013-05-16 52 views
1

這可能相當簡單,但不幸的是,我很難確定將具有「In」條件的SQL查詢轉換爲lambda。將「In」條件的SQL查詢轉換爲Lambda表達式

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

有沒有什麼辦法可以將其轉換?

回答

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;大多數ORMS都提供了pass-thru機制。

+0

Marc在每次迭代中都會在'wftrn'中搜索'x.approver_id == 32060'? – Habib

+1

@Habib取決於提供者是什麼; OP建議(通過提及sql)它是類似於EF/L2S的東西,在這種情況下,我希望*作爲單個組合的TSQL查詢下去;並明確*不*搜索每個「應用程序」迭代的approver_id –

+1

在where子句之後不應該有'.Select(x => x.wfapp_id)'? – Dirk

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); 

您可能會看到:Creating IN Queries With Linq To Sql

+0

在早期查詢中調用'ToList'可能是一個壞主意,如果它阻止了組合 - 第一個查詢可能會在網絡上強制大量行。它顯然取決於上下文,儘管 –

3

爲了清楚起見,你可以在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或不。

相關問題