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

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

我找不到如何将用户输入的日期与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.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转换为一个长日期进行比较,这似乎会在搜索数百万条记录时产生太多开销

我对这里的想法一无所知

问题:

  • 无法将类型“System.Nullable”`1[[System.DateTime,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]强制转换为类型“System.Object”。LINQ to实体仅支持强制转换EDM基元或枚举类型

  • 找不到任何匹配项,即使有确切的日期时间

  • 突然间神奇地工作了

  • LINQ to实体中不支持指定的类型成员“日期”。仅支持初始值设定项、实体成员和实体导航属性

  • 最终解决方案
    根据选择的答案,我发现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端进行任何转换,这将提高性能。