微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决搜索适用于除日期字段以外的所有字段

我想按日期和格式 (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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。