繁体   English   中英

ASP.NET MVC 按日期过滤结果返回 0 个结果

[英]ASP.NET MVC Filtering results by date returns 0 results

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

查询和过滤:

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 表中, Order_Datedate数据类型(不是datetime )。 然而,在模型中Order_Date是一个DateTime变量,因为据我所知 C# 不只有日期。

下面是问题的一个例子:

例子

结果

结果

我究竟做错了什么?

您正在将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 用户将不明白为什么他们没有结果。

如果您想按日期搜索,最好的解决方案是使用日期输入控件。 如果对于您的 UX 而言,在文本控件中输入日期而不是日期控件很重要,那么您应该标记文本并尝试识别文本上的日期,转换为日期并使用日期来比较 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)
    );

我想通了使用乔纳森的评论。 这是最简单的方法:

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));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM