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

How can I compare a nullable type date using user entered date?

我找不到如何将用户输入的日期与 EF6 创建的 table 上的日期进行比较。我正在使用 LINQ 扩展来搜索数据库,并尝试了多个编译建议,但在执行过程中失败了。

用户输入:

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. Unable to cast the type 'System.Nullable``1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types.

  2. 没有找到任何匹配项,即使有准确的日期时间

  3. 突然间神奇地起作用了。

  4. The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

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

某些 .NET 操作无法隐式转换为等效的 SQL 操作,对于这些您需要使用 System.Data.Entity.DbFunctions 中提供的方法。在您的具体示例中,您应该尝试使用 TruncateTime 方法而不是访问 DateTime 实例的 .Date 属性。

示例:

var date = userDate.Date;
dbSet.Where(x => DbFunctions.TruncateTime(x.Date) == date);

编辑:另外,SQL 服务器不一定支持与 .NET 相同的 datetime 值范围,因此如果您的字符串解析失败并且您得到 DateTime.MinValue它可能不是您的 SQL 服务器支持的 datetime 值。