C# 如何使用用户输入的日期比较可空类型的日期?
我找不到如何将用户输入的日期与EF6创建的表上的日期进行比较。我使用LINQ扩展来搜索数据库,并尝试了多种编译建议,但在执行过程中失败 用户输入:C# 如何使用用户输入的日期比较可空类型的日期?,c#,entity-framework,datetime,entity-framework-6,C#,Entity Framework,Datetime,Entity Framework 6,我找不到如何将用户输入的日期与EF6创建的表上的日期进行比较。我使用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
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
迄今为止的尝试:
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()
有效,但它生成了一个长日期字符串,如2005年5月12日00:00:00
,试图将我的userdate转换为一个长日期进行比较,这似乎会在搜索数百万条记录时产生太多开销
我对这里的想法一无所知
问题:
根据选择的答案,我发现SqlFunctions类有一个.DateDiff方法,它映射到T-sqldatediff函数。我用它来计算两个日期之间的天数,只选择返回0的日期。这使我能够比较日期,而无需在SQL端进行任何转换。某些.NET操作无法隐式转换为等效的SQL操作,因此您需要使用中提供的方法。在您的特定示例中,您应该尝试使用
TruncateTime
方法,而不是访问DateTime
实例的.Date
属性
例如:
var date = userDate.Date;
dbSet.Where(x => DbFunctions.TruncateTime(x.Date) == date);
编辑:或者,SQL server不一定支持与.NET相同的
datetime
-值范围,因此,如果字符串分析失败,并且您获得datetime.MinValue
,则它可能不是SQL server中支持的datetime
值。因此您说有错误。。。这是什么错误?(在dbContext
上直接使用Where
而不是在上下文中的表上使用Where,这很奇怪,顺便说一下…)如果数据库值可以为空,为什么用户输入值不能为空?@JonSkeet,我现在正试图重新创建错误以发布。。。谢谢你指出这一点,我试图缩短代码,但做得太多了。用正确的代码更新了问题。@David,我认为TryParse总是返回一个值,因此我认为不将其声明为null可以节省资源。因此,我查看了System.Data.Entity.DbFunctions的文档,找到了类SqlFunctions。它有许多我在编写T-SQL时经常使用的函数,这有助于我从.NET代码过渡到T-SQL。使用它,我尝试了dbSet.Where(x=>SqlFunctions.DateDiff(“Day”,x.Date.Value,userdate)==0)代码>。。它成功了。现在提问,因为我知道这也可以。其中(x=>x.Date.Value==userdate.Date)
有任何性能差异吗?谢谢你的帮助。我最终使用了上面列出的函数。我发现它不需要在SQL端进行任何转换,这将提高性能。