2010-09-10 78 views
1

我建设我的ASP.NET MVC项目动态查询由以下:执行SELECT语句日期在WHERE子句失败

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执行查询时的日期是在哪里串我收到以下错误:

The argument types 'Edm.DateTime' and 'Edm.Int32' are incompatible for this operation. Near WHERE predicate, line 1, column 103.

关于我的问题的任何想法?

在此先感谢

+0

有两个问题:数据库供应商是什么?数据库中的BirthDate的格式是什么? – 2010-09-10 03:59:38

+0

这是一个Microsoft SQL Server数据库。 BirthDate是DateTime类型的 – Matt 2010-09-10 05:48:52

+0

你是如何执行这个查询的? – 2010-09-10 06:15:23

回答

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功能生成查询(它“知道”如何生成数据库查询的日期时间参数)。

检查样本here

+0

那有效果 – Matt 2010-09-12 21:46:54

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

+0

我将其更改为:userInfos.BirthDate <= CONVERT(DATETIME, '10/09/1920 00:00:00',102) 但是我收到一个错误消息:“'CONVERT'无法解析为有效的类型或函数,靠近简单的标识符,第1行,第106列。 – Matt 2010-09-10 05:47:26

+0

您是否只尝试过在日期字符串周围使用单引号? – 2010-09-10 05:59:17

+0

是的,我试过单引号 – Matt 2010-09-10 06:43:16