如何使用用户输入的日期比较可空类型的日期?

时间:2015-03-29 16:11:07

标签: c# entity-framework datetime entity-framework-6

我无法找到如何将用户输入的日期与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,并试图将我的用户日期变成一个较长的日期进行比较,看起来它似乎也会创建搜索数百万条记录时会产生很多开销。

我在这里有很多想法。

的问题:

  1.   

    无法转换类型' System.Nullable``1 [[System.DateTime,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'键入' System.Object'。 LINQ to Entities仅支持转换EDM原语或枚举类型。

  2. 即使有确切的日期时间,也找不到任何匹配

  3. 神奇地突然工作。

  4.   

    指定的类型成员'日期' LINQ to Entities不支持。仅支持初始化程序,实体成员和实体导航属性。

  5. 最终解决方案 根据选定的答案,我发现SqlFunctions类有一个.DateDiff方法,该方法映射到T-SQL DateDiff函数。我用它来计算两个日期之间的天数,并仅选择返回0的日期。这使我可以比较日期而无需在SQL端进行任何转换。

1 个答案:

答案 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值。