【问题标题】:ASP.NET MVC Filtering results by date returns 0 resultsASP.NET MVC 按日期筛选结果返回 0 个结果
【发布时间】: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)

标签: c# sql asp.net-mvc date datetime


【解决方案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));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多