搜索适用于除日期字段以外的所有字段

Search works on all fields except the date field

我想按日期搜索格式为 (dd/MM/yyyy) 的数据,例如“20/01/2021”。搜索适用于 ADDRESS 和 NAME 字段 ,但不适用于 CREATE_DATE.

这是我的代码:

       // search
        if (!string.IsNullOrEmpty(search))
        {
            List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());

            res = res.Where(x =>
            terms.Any(
                str => x.NAME.Contains(str) ||
                x.ADDRESS.Contains(str) ||  
                x.DATE_CREATE.ToString().Contains(str)
            
            ));

            var test = res.FirstOrDefault().DATE_CREATE.ToString();
        }

这是请求:

http://localhost:6289/api/Customer?search=20/01/2021,hous

这是 terms 和 test var 的输出:

这就是日期的保存方式,它们的日期是日期时间类型

我认为将数据时间转换为日期 ToString() 您需要转换日期格式,如“dd/MM/yyyy”,这是您 url 中的参数 (search=20/01/2021) 然后在这里[x.DATE_CREATE.ToString().Contains(str)] 我会使用“等于”,就像 [x.DATE_CREATE.ToString("dd/MM/yyyy").equals(str)] 在查询中更具体.

您的代码实际上可以在我的机器上运行,但前提是我使用了@JustShadow 指出的适当的文化设置。 适当的文化:导致 datetime.ToString() 格式化日期 dd/MM/yyyy 格式。 出于测试目的,我在 if 语句中使用了“es-ES”文化,例如以下代码:

Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");

我建议您根据此修改代码:

if (!string.IsNullOrEmpty(search))
{
   List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());

   var originalCulture = Thread.CurrentThread.CurrentCulture;
   try
   {
      // use any locale which results a datetime.ToString() output in dd/MM/yyyy format
      Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); ;

      res = res.Where(x =>
      terms.Any(
         str => x.NAME.Contains(str) ||
         x.ADDRESS.Contains(str) ||
         x.DATE_CREATE.ToString().Contains(str)));

      var test = res.FirstOrDefault().DATE_CREATE.ToString();
   }
   finally
   {
      Thread.CurrentThread.CurrentCulture = originalCulture;
   }
}

如果您的输入总是 dd/MM/yyyy 格式,这就足够了。

编辑: 您可以尝试在 ToString() 调用中使用自定义格式字符串来实现@bitapinches 建议的工作代码。我认为我的解决方案执行得更好,因为在 LINQ 将执行的每个比较中不需要解析自定义格式字符串。以下是可供参考的备选方案:

if (!string.IsNullOrEmpty(search))
{
   List<string> terms = search.Split(',').ToList().ConvertAll(d => d.ToLower());

   res = res.Where(x =>
      terms.Any(
      str => x.NAME.Contains(str) ||
      x.ADDRESS.Contains(str) ||
      x.DATE_CREATE.ToString(@"dd\/MM\/yyyy").Contains(str)));

   var test = res.FirstOrDefault().DATE_CREATE.ToString();
}