выполнение инструкции SELECT с датой в предложении WHERE завершается неудачно - PullRequest
1 голос
/ 10 сентября 2010

Я строю динамический запрос в моем проекте ASP.NET MVC следующим образом:

Dim queryString As String = "SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos"
If strWhere <> "" Then
    queryString = queryString & " WHERE " & strWhere
End If

' Call the constructor with the specified query and the ObjectContext. 
Dim SearchUsersQuery As New System.Data.Objects.ObjectQuery(Of UserInformation)(queryString, MyDB)

Dim lstOfUsers As List(Of UserInformation) = SearchUsersQuery.ToList

Где, в основном, strWhere - строка, в которой я создаю динамический фильтр в зависимости от того, что пользователь выбирает для поиска.

Это прекрасно работает, пока мне не нужно добавить сравнение даты в предложение даты.

Я пытаюсь сделать следующее:

strWhere = " userInfos.BirthDate <= " & StartDateForQuery.ToShortDateString

Что в итоге будет:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos Where userInfos.BirthDate <= 10/09/1992"

Но когда я пытаюсь выполнить запрос с помощью ToList, когда в строке where указана дата, я получаю следующую ошибку:

Типы аргументов Edm.DateTime и Edm.Int32 несовместимы для этой операции. Предикат около WHERE, строка 1, столбец 103.

Есть идеи по поводу моей проблемы?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Вы не можете сравнивать даты таким образом.

При этом:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos 
 WHERE userInfos.BirthDate <= 10/09/1992"

10/09/1992 интерпретируется как значение Int.

Попробуйте заключить в одинарные кавычки это значение, как показано ниже:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos 
 WHERE userInfos.BirthDate <= '10/09/1992'"

Возможно, вам придется вызывать функцию преобразования даты в базе данных (зависит от вашего поставщика базы данных), передавая ей эту строку даты.

Вот так:

"SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos 
 WHERE userInfos.BirthDate <= DataBaseSpecificToDateFunction('10/09/1992')"

Проблема в том, что этот запрос отправляется в базу данных и является сервером базы данных, который его выполнит.Вот почему вам нужна функция преобразования даты, специфичная для базы данных.

Например: в Oracle у нас есть функция to_date для преобразования строки в datetime с использованием заданного шаблона:

to_date('1998/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam')

В SQL Server у нас есть функция convert, как в:

convert(datetime, '2016-10-23 20:44:11',20) -- yyyy-mm-dd hh:mm:ss(24h)

Больше примеров здесь .

0 голосов
/ 10 сентября 2010

Почему бы вам не использовать следующий код:

Dim queryString As String = "SELECT VALUE userInfos FROM MyDBEntities.UserInformations AS userInfos"
' Call the constructor with the specified query and the ObjectContext. 
'
Dim SearchUsersQuery As New System.Data.Objects.ObjectQuery(Of UserInformation)(queryString, MyDB)

'verify if should be a startdate for adding to query
'
If StartDateForQuery <> "" Then
 'add the condition to the query
    '

 SearchUsersQuery = SearchUsersQuery.Where("it.BirthDate  <= @BirthDate ")

 'add the parameter to be used
    '
 SearchUsersQuery.Parameters.Add(New ObjectParameter("BirthDate ", StartDateForQuery))
End If

Dim lstOfUsers As List(Of UserInformation) = SearchUsersQuery.ToList

Вы используете возможности linq для генерации запросов (он «знает», как генерировать параметр datetime для запроса БД).

Проверьте образец здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...