类似于使用动态lambda表达式搜索日期时间字段

本文关键字:搜索 日期 时间 字段 表达式 lambda 动态 类似于 | 更新日期: 2023-09-27 17:58:24

我正在形成如下的字符串表达式。

     string Condition = " it.person_id = " + personId.ToString();
     if (lstPersonFields != null)
      {
         foreach (var field in lstPersonFields )
           {                           
              string  fieldCondition = " And it." + field.FieldName.ToString();
                if (field.FieldCondition == "Contains")
                  {
                    fieldCondition = fieldCondition + " Like '%" + field.FieldValue.ToString() + "%'";
                  }
                 else if (field.FieldCondition == "Equals")
                  {
                   fieldCondition = fieldCondition + " = '" + field.FieldValue.ToString()+"'";
                  }
                 Condition = Condition + fieldCondition;
           }
      }
      var personSearch = FullPersonlst.Where(Condition).ToList();

上面的代码在类似的搜索中正确地处理了日期时间以外的值,并为等日期时间字段抛出了错误

Like arguments must be of string type 

如何搜索日期时间字段?

类似于使用动态lambda表达式搜索日期时间字段

作为一个动态lambda表达式来实现这一点类似于:

var arg = Expression.Parameter(typeof(Person), "it");
var body = Expression.Equal(
    Expression.PropertyOrField(arg, "PersonId"),
    Expression.Constant(personId));
if (lstPersonFields != null)
{
    foreach (var field in lstPersonFields)
    {
        var member = Expression.PropertyOrField(arg, field.FieldName);
        switch (field.FieldCondition)
        {
            case "Contains":
                body = Expression.AndAlso(body,
                    Expression.Call(typeof(SqlMethods), "Like", null,
                        member,
                        Expression.Constant("%" + field.FieldValue + "%")));
                break;
            case "Equals":
                body = Expression.AndAlso(body,
                    Expression.Equal(
                       member,
                       Expression.Constant(field.FieldValue)));
                break;
        }
    }
}
var lambda = Expression.Lambda<Func<Person,bool>>(body, arg);
var personSearch = FullPersonlst.Where(lambda).ToList();

正如错误所说,不应该将like用于非字符串值。这也毫无意义。如果要搜索特定的日期时间,可以使用datetime=value。在两者之间的时间范围内进行搜索。您需要检查要搜索的特性类型,并在查询中使用合适的方法来拟合该类型。

就我个人而言,我永远不会使用这样一个"动态查询创建者"。