2011-03-05 187 views
2

我有一個使用LINQ到SQL的查詢。它查詢底層數據庫表房間。它使用Where條件來縮小結果,即:LINQ-to-SQL查詢返回無結果

  1. 性別。
  2. 目前入住<最多可供
  3. 可用標誌的檢驗

我知道這應該返回的結果,但它一直返回一個空集。有任何想法嗎?代碼如下

Dim selectedHalls = (From sh In dbHalls.Rooms _ 
         Where sh.gender = Session("gender").ToString _ 
         Where sh.max_occupancy > sh.current_occupancy _ 
         Where sh.is_available = 1 _ 
         Select sh.building_name).Distinct() 

更新:我已經驗證了問題出在哪裏聲明= sh.is_available 1,這沒有任何意義,因爲這是位字段。

+2

您是否在此處放置了斷點,運行該應用程序,將鼠標懸停在'selectedHalls'上並查看了生成的SQL代碼?嘗試將其複製到SSMS,看看它爲什麼不會產生任何結果... – 2011-03-05 16:27:53

+0

嗯......我只是試過,但當我嘿,我沒有看到SQL查詢。它說「selectedHalls |數據庫查詢」並擴展 - 但我不知道在哪裏可以找到SQL? – davemackey 2011-03-05 16:35:44

回答

4

我認爲找出產生SQL字符串的問題的最佳方法,並通過直接對數據源執行它來測試「它應該返回結果」的假設。

要做到這一點:

 Dim sqlQuery As String = dbHalls.GetCommand(
        (From sh In dbHalls.Rooms _ 
        Where sh.gender = Session("gender").ToString _ 
        Where sh.max_occupancy > sh.current_occupancy _ 
        Where sh.is_available = 1 _ 
        Select sh.building_name).Distinct() 
      ).CommandText 

(?我通常使用C#,但我認爲這是你如何聲明在VB中的字符串,右)

不管怎麼說,這會給你的SQL語句將比我們無法查看底層數據庫所能提供的任何內容更具信息性。

跳出來對我的唯一可能有問題的是Session("gender")。您基本上依靠您的Session對象進行填充,併爲區分大小寫的字符串鍵"gender"設置值,該值與數據庫中區分大小寫的字符串字段gender相匹配。這聽起來像是一些假設,可能會或可能不會被測試,並可能是收到空結果的原因。

編輯 我剛看到你的更新。 Linq-to-sql將位字段解釋爲布爾值,而不是整數值。嘗試將其更改爲where sh.is_available

+0

太棒了。感謝您的幫助! – davemackey 2011-03-07 15:18:07

2

你真的在dbHalls.Rooms.sh中記錄他們的性別爲「女性」和「男性」嗎?

+0

舊版代碼。 :P – davemackey 2011-03-05 16:36:09

+0

已更正。沒有區別。 – davemackey 2011-03-05 16:47:34

4

我沒有看到LINQ的任何明顯錯誤,因此請嘗試刪除Where子句並將它們一次帶回。這應該讓你知道是什麼導致了這個問題,但我同意安德魯沃格爾性別條款是一個可能的嫌疑犯。

如果查詢在所有Where子句消失後返回空,那麼您將知道這裏還有其他事情正在進行。