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不起作用吗?或者可以提出解决方案?+如果我能提供任何东西让它更清楚,请告诉我。

C#MVC4 Linq-按日期或日期+时间过滤表格

您需要两个查询:

首先检查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));

您在这里主要做的是规范化比较基础,由于数据和时间有不同的分隔符,因此简单的子字符串检查可以为您提供正确的结果。

所以假设TimeStarted14/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"),但这不是必需的。