类似于使用动态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表达式来实现这一点类似于:
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。在两者之间的时间范围内进行搜索。您需要检查要搜索的特性类型,并在查询中使用合适的方法来拟合该类型。
就我个人而言,我永远不会使用这样一个"动态查询创建者"。