我无法找到如何将用户输入的日期与EF6创建的表格上的日期进行比较。我使用LINQ Extensions搜索数据库并尝试了多个编译建议,但在执行过程中失败了。
用户输入:
DateTime userdate;
DateTime.TryParse(search.Value, out userdate);
到目前为止尝试:
a = dbContext.Messages.Where(x => x.Date.Date == userdate.Date); // doesn't compile
a = dbContext.Messages.Where(x => x.Date.Value.Date == userdate.Date); // error # 4
a = dbContext.Messages.Where(x => x.Date.ToString() == userdate.Date.ToString()); // issue #2
a = dbContext.Messages.Where(x => x.Date.Value.ToString() == userdate.Date.ToString()); // issue #2
a = dbContext.Messages.Where(x => Object.Equals(x.Date, userdate.Date)); // throws error #1
a = dbContext.Messages.Where(x => Object.Equals(x.Date.Date, userdate.Date)); // throws error #1
我已经尝试过这一百万次搜索并找到可编译的解决方案,但在执行时总会抛出错误。
有一个版本的ToString()
可以使用,但是它会生成一个长日期字符串,例如May 12, 2005 00:00:00
,并试图将我的用户日期变成一个较长的日期进行比较,看起来它似乎也会创建搜索数百万条记录时会产生很多开销。
我在这里有很多想法。
的问题:
无法转换类型' System.Nullable``1 [[System.DateTime,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'键入' System.Object'。 LINQ to Entities仅支持转换EDM原语或枚举类型。
即使有确切的日期时间,也找不到任何匹配
神奇地突然工作。
指定的类型成员'日期' LINQ to Entities不支持。仅支持初始化程序,实体成员和实体导航属性。
最终解决方案 根据选定的答案,我发现SqlFunctions类有一个.DateDiff方法,该方法映射到T-SQL DateDiff函数。我用它来计算两个日期之间的天数,并仅选择返回0的日期。这使我可以比较日期而无需在SQL端进行任何转换。
答案 0 :(得分:3)
某些.NET操作无法隐式转换为等效的SQL操作,因为您需要使用System.Data.Entity.DbFunctions中提供的方法。在您的特定示例中,您应该尝试使用TruncateTime
方法,而不是访问.Date
实例的DateTime
属性。
示例:
var date = userDate.Date;
dbSet.Where(x => DbFunctions.TruncateTime(x.Date) == date);
编辑:或者,SQL服务器不一定支持与datetime
- 相同的范围 - 因为如果您的字符串解析失败并且您得到DateTime.MinValue
它可能不受支持SQL服务器中的datetime
值。