C#MVC4 Linq-按日期或日期+时间过滤表格
本文关键字:日期 时间 过滤 表格 Linq- C#MVC4 | 更新日期: 2023-09-27 18:19:56
我有一个包含多个列的表,我按列+用户输入的字符串进行搜索,以筛选结果。然而,我在正确筛选DateTime列时遇到了问题(其余的都可以)。我可以显示完全匹配的结果,但如果用户只输入了一个没有时间的日期,我就不会得到结果。
预期结果是,如果用户输入14/08或14/08/2014或14/08:2014 12:56:32,则应显示与此输入日期或日期和时间匹配的所有结果。
我的Linq
var filterresults = from m in db.cd_CleardownCore
select m;
我的过滤器尝试1:(仅精确匹配<有效)
DateTime datetime = Convert.ToDateTime(searchString);
string strDate = datetime.ToShortDateString();
filterresults = filterresults.Where(x => x.TimeStarted == datetime)
我的筛选尝试2:(检查列是否包含日期<当前不起作用)
filterresults = filterresults.Where(x => x.TimeStarted.ToString().Contains(strDate));
那么,有人能解释为什么尝试2不起作用吗?或者可以提出解决方案?+如果我能提供任何东西让它更清楚,请告诉我。
您需要两个查询:
首先检查datetime
对象是否有除00:00:00
以外的时间,这意味着指定了某个时间部分,在这种情况下,您需要进行精确比较,否则比较字段中的已通过日期范围,如:
DateTime datetime = Convert.ToDateTime(searchString);
if (datetime.TimeOfDay != TimeSpan.Zero) //comparison with 00:00:00 time
{
filterresults = filterresults.Where(x => x.TimeStarted == datetime);
}
else
{
DateTime plusOneDateTime = datetime.AddDays(1).Date;
filterresults = filterresults.Where(x => x.TimeStarted >= datetime.Date
&& x.TimeStarted < plusOneDateTime);
}
查询失败的原因是LINQ to实体中的ToString
使用将失败,因为没有从LINQ表达式到底层数据源语言(SQL)的可用转换。
还要记住,您与精确时间的比较可能不会返回任何结果,因为searchString
可能不包含数据库中存储的精确时间。在这种情况下,您可以采用小时/分钟/秒的范围检查。
DateTime匹配将很棘手,因为您接受大量输入。
如果格式或多或少是固定的,那么您可能不需要字符串匹配。
因此,假设您总是在DD/MM/YYYY HH:MI:SS中接受,您可以尝试
filterresults = filterresults.ToArray().Where(x => x.TimeStarted.ToString("dd/MM/yyyy hh:mm:ss").IndexOf(strDate) > -1));
您在这里主要做的是规范化比较基础,由于数据和时间有不同的分隔符,因此简单的子字符串检查可以为您提供正确的结果。
所以假设TimeStarted
是14/08/2014 12:56:32
:
"14/08/2014 12:56:32".IndexOf("14/08") // matches
"14/08/2014 12:56:32".IndexOf("14/08/2014") // matches
"14/08/2014 12:56:32".IndexOf("14/08/2014 12:56:32") // matches
只要人们按如下顺序搜索日期的部分,这种逻辑就会起作用:
DD
DD/MM
年/月/日
等等
如果用户输入09,09表示天或月,这可能是不明确的。但如果你的UI总是遵循规则,前2个是天,后2个是月,后4个是年,依此类推,那么你就没事了。
还要注意,我正在做ToArray
,因为Linq2Entities不理解ToString
。
您想要比较日期部分——所以这样做:
DateTime datetime = Convert.ToDateTime(searchString);
filterresults = filterresults.Where(x => x.TimeStarted.Date == datetime.Date)
您也可以使用ToString("d")
,但这不是必需的。