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

问题描述

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

这是我的代码

       // 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的输出

enter image description here

enter image description here

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

enter image description here

解决方法

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

,

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

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