2011-03-05 156 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子句消失后返回空,那么您将知道这里还有其他事情正在进行。