Я думаю, что лучший способ выяснить, в чем заключается проблема, это сгенерировать строку 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
с учетом регистра в вашей базе данных. Это звучит как довольно много предположений, которые могут или не могут быть проверены и могут быть причиной для получения пустых результатов.
EDIT
Я только что видел ваше обновление. Linq-to-sql интерпретирует битовое поле как логическое значение, а не целочисленное значение. Попробуйте изменить его на where sh.is_available