ASP.NET MVC 按日期筛选结果返回 0 个结果

Posted

技术标签:

【中文标题】ASP.NET MVC 按日期筛选结果返回 0 个结果【英文标题】:ASP.NET MVC Filtering results by date returns 0 results 【发布时间】:2021-09-18 07:59:15 【问题描述】:

我正在尝试按日期过滤数据库查询的结果。用户将输入一个日期值作为字符串,然后我使用该字符串与每个查询结果的日期进行比较以尝试找到匹配项,但是即使我知道存在匹配项,也不存在匹配项。

查询和过滤:

var documents = from s in db.Documents
                            select s;

if (!String.IsNullOrEmpty(searchString))

    documents = documents.Where(s => s.Order_Date.ToString().Contains(searchString) || 
                                     s.Comment.Contains(searchString));

需要注意的是,如果在Comment 列中找到searchString,那么它可以正常工作。但同样,日期永远不会匹配。

在应用程序连接到列Order_Date 的SQL 表中,数据类型为date(不是datetime)。但是在模型中 Order_Date 是一个 DateTime 变量,因为据我所知 C# 没有日期。

这是一个问题的例子:

结果

我做错了什么?

【问题讨论】:

尽量保持值'date-like'而不是使用字符串。 DateTime.Parse您的用户输入。创建 2 个vars:dateFromdateTo。将dateFrom设置为输入的'0:0:0',将dateTo设置为输入的'23:59:59',搜索s.order_date >= dateFrom && s.order_date <= dateTo 我不明白你说的第二部分。比较s.order_date >= dateFrom && s.order_date <= dateTo根本不使用searchString? dateFromdateTo 将是该日期的午夜和该日期的晚上 11:59:59 (23:59:59) 【参考方案1】:

您将11/8/2004s.Order_Date.ToString() 进行比较。这种方法有几个问题:

也许s.Order_Date 包含2004-08-11 但当你这样做时s.Order_Date.ToString() 它会变成月-日-年日期格式8/11/2004(而不是日-月-年)和8/11/2004 != 11/8/2004 如果用户输入 11/08/2004 会发生什么? 11/08/2004 != 11/8/2004。用户不会明白为什么他们没有结果。

如果您想按日期搜索,最好的解决方案是使用日期输入控件。如果对于您的用户体验而言,在文本控件而不是日期控件中输入日期很重要,那么您应该标记文本并尝试识别文本上的日期,转换为日期并使用日期来比较 linq 表达式。


DateTime? search_date_start = tokenize_and_extract_date_start(searchString)
DateTime? search_date_end = tokenize_and_extract_date_end(searchString)
String? search_comment = remove_dates_from_search_string(searchString)

documents = 
    documents
    .Where(s => 
       search_date_start == null || 
       s.Order_Date >= search_date_start) 
    )
    .Where(s => 
       search_date_end == null || 
       s.Order_Date <= search_date_end) 
    )
    .Where(s => 
       search_comment == null ||
       s.Comment.Contains(search_comment)
    );

【讨论】:

这是很好的信息,但与我根据乔纳森的评论找到的方法相比似乎过于复杂,但感谢您输入此信息。无论如何,我都会将此标记为正确答案。【参考方案2】:

我用乔纳森的评论弄明白了。这是最简单的方法:

if (!String.IsNullOrEmpty(searchString))

    try
    
        var test = DateTime.Parse(searchString);
        documents = documents.Where(s => s.Order_Date == test);
    
    catch (FormatException e)
    
        documents = documents.Where(s => s.Comment.Contains(searchString));
    

【讨论】:

以上是关于ASP.NET MVC 按日期筛选结果返回 0 个结果的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC 使用 jquery-form 插件上传文件并返回 Json 结果

asp.net mvc,以 JSON 形式返回多个视图

ASP.NET MVC 全局过滤器(FilterConfig)标记在控制器上和方法上的筛选器执行顺序

ASP.NET MVC 返回 Json 结果?

asp.net mvc 文件跨域上传,接收返回结果

我没有从 ASP.NET MVC 中的控制器获取值