我正在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是一个字符串,我建立了一个动态过滤器,具体取决于用户选择搜索的内容。
这很有用,直到我需要在date子句中添加日期比较。
我正在尝试以下方法:
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列。
关于我的问题是什么想法?
提前致谢
答案 0 :(得分:1)
您无法比较日期。
执行此操作时:
"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 函数将字符串转换为使用给定模式的日期时间:
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)
更多样本here。
答案 1 :(得分:0)
为什么不使用下一个代码:
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参数)。
检查样本here