2012-07-04 86 views
1

我有,我認爲是一個非常簡單的查詢。從Sql轉換到Linq

在普通的SQL這會閱讀:

SELECT [column names] 
FROM  agentscheduledetail 
WHERE  (date = '2012-07-04') AND 
      (
      exception = 'Break (No Sign Off)' OR 
      exception = 'Break' OR 
      exception = 'Break (Signed Out)' 
      ) 

這將返回約900條記錄。

但是,當我試圖將這個輸入到我的控制器中時,我最終得到了大約300,000條記錄 - 所以我認爲我的AND和OR不起作用。我試過Linqer,但不能得到它的工作(我知道這可能不是實際的LINQ,但在VS中的等效查詢 - 如果有LINQ版本...我也會感激這一點,如果可能)。

我控制器查詢:

 var dte = DateTime.Today; 

     return View(db.agentscheduledetails.Where 
      (
      d => d.date == dte && d.agentName.StartsWith("ta") && 
      (
       d.exception == "Break (No Sign Off)" || 
       d.exception == "Break" || 
       d.exception == "Break (Signed Out)" 
      ) 
      ).ToList() 
      ); 

誰能無論是)讓我知道我和我的& &腳麻|| (和/或),或者b)有沒有一種方法可以通過VS中的代碼來查看上面查詢在常規SQL中轉換的內容,以便我可以嘗試找出我要出錯的地方?

感謝您的幫助,

馬克

+0

嘗試使用.Contains()來檢查字符串 –

+1

您尚未指定是使用LINQ to SQL還是實體框架 - 但無論哪種方式,都可以,查看生成的SQL的方法。例如,在LINQ to SQL中查看'DataContext.Log'。 –

+0

設置數據庫上下文以將sql查詢輸出到日誌文件或調試器窗口。檢查是否正確。 –

回答

1

以下內容可能是您嘗試執行操作的簡化版本,您的LINQ還包含與SQL比較代理名稱的附加語句?

var currentDate = DateTime.Today; 
var exceptionTypes = new List<string>() { "Break (No Sign Off)", 
              "Break", "Break (Signed Out)" }; 

db.agentscheduledetails.Where(d => d.date == currentDate && 
              exceptionTypes.Contains(d.exception)); 

一件事,你可以嘗試越來越的LinqPad副本舉行,這會讓你對數據庫運行您的LINQ語句,並會告訴你生成的SQL語句是什麼。

+0

嗨 - 謝謝 - 那完美的作品。你能否在我正在做的陳述中使用&&和||?(我會標記爲答案,因爲SO允許) - 歡呼,馬克 – Mark

+0

如果我在LinqPad中運行類似的東西,那麼我會得到所需的結果和正確的SQL。我不確定你的設置,但如果它是實體框架,那麼我不知道會發生什麼,但在正常的Linq to SQL中它應該工作正常嗎?這種方法往往是首選,但它通常比較容易編寫。 –

0
從別的

除此之外,

d.agentName.StartsWith("ta") 

不會出現在你的原始SQL ...?

+0

安裝,你是正確的 - 我補充說,看看它是否會過濾記錄 - 它沒有' t ... – Mark