【发布时间】:2014-10-02 14:04:18
【问题描述】:
背景:我正在尝试实现搜索功能。我的搜索功能的一部分是能够搜索日期(德语格式)。您应该可以输入“2014”,然后您将获得以 2014 为年份的每个日期,或者以德语格式输入整个日期(21.03.2014)。
很遗憾,我的代码不起作用:
_unitOfWork.StammdatenRepository.Get()
.Where(s => (s.MyDate.HasValue
&& s.MyDate.Value.ToShortDateString().Contains(keyword)));
如果'2014'、'2012' 等是我的关键字,那么它可以工作。如果我以德语格式输入整个日期,我不会得到任何结果。我认为这是因为 ToShortDateString 方法返回的“错误”格式。
更新 1: 对于迟到的回复/更新,我深表歉意。直到今天才能得到代码。 if/else 构造不起作用,因为我的原始代码要复杂得多(这是实体框架的复杂 WHERE 条件)。用户可以输入一个关键字,我在不同的列中查找该关键字。一栏是“BeginnVos”,我的日期栏:
string keyword = inputModel.Keyword.ToLower();
stammdatenEntityModels =
_unitOfWork.StammdatenRepository.Get()
.Where(
s =>
s.Geloescht == false &&
((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
(s.SerienNummer.Contains(keyword)) ||
(s.Bezeichnung.ToLower().Contains(keyword)) ||
(s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
(s.BeginnVos.HasValue && s.BeginnVos.Value.ToShortDateString().Contains(keyword)) ||
(s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
(s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
))
.OrderBy(orderBy)
.Skip(inputModel.EntriesToDisplay*(inputModel.Page - 1))
.Take(inputModel.EntriesToDisplay)
.ToList();
我尝试了不同的方法,甚至像
s.BeginnVos.Value.ToString("dd.MM.yyyy").Contains(keyword))
但我仍然没有得到合适的结果(列表为空)。
用户输入“22.02.2013”(德语格式),但在我的数据库中,它当然是以 sql 日期格式存储的:2013-02-22 00:00:00.000。是否需要对用户输入进行任何转换?
我的解决方案,感谢 Habibi:
string keyword = inputModel.Keyword.ToLower();
DateTime dateTime = new DateTime();
DateTime.TryParseExact(keyword, "d'.'M'.'yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime);
stammdatenEntityModels =
_unitOfWork.StammdatenRepository.Get()
.Where(
s =>
s.Geloescht == false &&
((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
(s.SerienNummer.Contains(keyword)) ||
(s.Bezeichnung.ToLower().Contains(keyword)) ||
(s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
(s.BeginnVos.HasValue && s.BeginnVos == dateTime) ||
(s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
(s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
))
.OrderBy(orderBy)
.Skip(inputModel.EntriesToDisplay*(inputModel.Page - 1))
.Take(inputModel.EntriesToDisplay)
.ToList();
【问题讨论】:
-
如果您输入完整的日期、仅该日期的记录或仅匹配年份的记录,您希望返回什么?
-
您确定
Thread.CurrentThread.CurrentCulture正在返回de-DE? -
如果输入完整的日期,只需要返回这个日期。我只想比较日期字符串,如果它包含字符串。我认为某种格式是错误的......
-
你调试过你的代码吗?您的 DateTime 的
ToShortDateString的值是多少?keyword是什么?你能展示一个不起作用的示例值吗?
标签: c# asp.net-mvc linq entity-framework linq-to-sql