【发布时间】:2015-03-30 02:32:35
【问题描述】:
我找不到如何将用户输入的日期与 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
我已经尝试搜索一百万次并找到可以编译的解决方案,但在执行时总是抛出错误。
有一个 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 类有一个映射到 T-SQL DateDiff 函数的 .DateDiff 方法。我用它来计算两个日期之间的天数,并只选择返回 0 的日期。这样我就可以比较日期,而无需在 SQL 端进行任何转换。
【问题讨论】:
-
所以你说有错误... 这是什么错误?
-
(直接在
dbContext上使用Where而不是在上下文中的表上使用很奇怪,顺便说一句...) -
如果数据库值可以为空,为什么用户输入的值不能为空?
-
@JonSkeet,我正在尝试重新创建错误以发布...感谢您指出这一点,我试图缩短代码并起飞太多。用正确的代码更新了问题。
-
@David,我认为 TryParse 总是返回一个值,所以我认为它可以通过不将其声明为空来节省资源。
标签: c# entity-framework datetime entity-framework-6