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

时间:2014-08-29 15:38:00

标签: c# linq asp.net-mvc-4 datetime linq-to-entities

我有一个包含多个列的表,我按列+用户输入的字符串搜索以过滤结果。但是我无法正确过滤我的DateTime列(其余所有工作)。我可以显示完全匹配的结果,但是如果用户只输入一个没有时间的日期我就不会得到任何结果。

预期结果是,如果用户输入14/08或14/08/2014或14/08/2014 12:56:32,则应显示与此输入日期或日期和时间匹配的所有结果。

My Linq

var filterresults = from m in db.cd_CleardownCore
                            select m;

我的过滤器尝试1 :(完全匹配< Works)

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

3 个答案:

答案 0 :(得分:2)

您需要两个查询:

首先检查datetime对象是否有00:00:00以外的时间,这意味着指定了某个时间部分,在这种情况下,您需要进行精确比较,否则比较传递日期范围的字段,如: / p>

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可能不包含存储在数据库中的精确时间。在这种情况下,您可以使用范围检查小时/分钟/秒。

答案 1 :(得分:1)

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
DD / MM / YYYY

等等。

如果用户输入09和09表示日期或月份,则可能不明确。但是如果你的用户界面总是遵守规则,那么前2个是日,第2个是月,第2个是年,依此类推,那么你就没事了。

另请注意,由于Linq2Entities不理解ToArray,我正在进行ToString

答案 2 :(得分:0)

您想要比较日期部分 - 所以这样做:

DateTime datetime = Convert.ToDateTime(searchString);


filterresults = filterresults.Where(x => x.TimeStarted.Date == datetime.Date)

您也可以使用ToString("d"),但这不是必需的。