代码之家  ›  专栏  ›  技术社区  ›  hous

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

  •  0
  • hous  · 技术社区  · 4 年前

    我想按日期搜索数据,格式为(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的输出:

    enter image description here

    enter image description here

    这就是日期的保存方式,日期类型为datetime

    enter image description here

    0 回复  |  直到 4 年前
        1
  •  2
  •   Soul    4 年前

    你的代码实际上可以在我的机器上运行,但前提是我使用了@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();
    }
    
    
        2
  •  2
  •   bita pinches    4 年前

    我认为强制转换数据时间到日期ToString()你需要转换日期格式,如“dd/MM/yyyy”,这是你网址中的参数(搜索=20/01/2021),然后Here[x.date_CREATE.ToString().Contains(str)]我会使用“equals”,如[x.date.CREATE.ToString(“dd/MM/Cyyyy).equals(str)”,以便在查询中更具体。