背景:我正在尝试实现搜索功能。我的搜索功能的一部分是搜索日期的能力(德语格式)。你应该可以进入" 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();
答案 0 :(得分:0)
来自MSDN:
ToShortDateString方法返回的字符串是 的文化敏感即可。它反映了当前定义的模式 culture的DateTimeFormatInfo 对象。例如,对于en-US 文化,标准的短日期模式是" M / d / yyyy&#34 ;;为de-DE 文化,它是" dd.MM.yyyy&#34 ;;对于ja-JP文化,它是" yyyy / M / d"。 特定计算机上的特定格式字符串也可以是 定制,使其不同于标准的短日期格式 字符串。
因此,如果您想严格使用德语格式的关键字,则可以使用显式格式s.MyDate.Value.ToString("dd.MM.yyyy").Contains(keyword)
答案 1 :(得分:0)
您确定要设置正确的文化吗?
ToShortDateString方法返回的字符串是区分文化的。它反映了当前文化的DateTimeFormatInfo对象定义的模式。例如,对于en-US文化,标准的短日期模式是“M / d / yyyy”;对于de-DE文化,它是“dd.MM.yyyy”;对于ja-JP文化,它是“yyyy / M / d”。特定计算机上的特定格式字符串也可以自定义,以便它与标准的短日期格式字符串不同。
如果您未将文化设置为de-DE
,则ToShortDateString
将返回使用en-US
区域设置格式化的日期(即09/30/2014
而不是30.09.2014
)
答案 2 :(得分:0)
我认为使用字符串表示法比较日期的逻辑是错误的。相反,您应该将关键字转换为DateTime
类型对象,然后比较DateTime
个对象。像:
string keyword = "2014";
DateTime parsedDate;
if (DateTime.TryParseExact(keyword, "yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
{
// only year provided
//Compare only year part
unitOfWork.StammdatenRepository.Get()
.Where(s => (s.MyDate.HasValue
&& s.MyDate.Value.Year == parsedDate.Year));
}
else if (DateTime.TryParseExact(keyword, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
{
//Complete date provided
//compare complete date
unitOfWork.StammdatenRepository.Get()
.Where(s => (s.MyDate.HasValue
&& s.MyDate.Value.Date == parsedDate.Date));
}
else
{
//invalid keyword
}
您可能遇到的另一个问题是,如果您的LINQ查询是针对数据提供程序(例如Entity框架)执行的,那么您最终可能会遇到ToShortDateString
不受支持的异常。因为ORM会将LINQ查询转换为谎言数据源语言,(在SQL Server的情况下可能是SQL)
您可以使用多种格式。 (注意格式为d
的单M
和d.M.yyyy
,对于单/双位日/月部分来说已经足够了,如果那不是要求那么你可以使用dd.MM.yyyy
格式)