复杂类型的表达式 属性
Expression for complex type property
我有一个场景,我从客户端网格的配置动态创建 WHERE 子句。客户端将一些 json 发送到服务器,然后我对其进行解析并随后转换为表达式,以便它可以作为 where 子句传递到存储库中。
目前我正在努力为复杂的 属性 类型创建表达式,例如:
public partial class Resource
{
public string DisplayName { get; set; }
public virtual ResourceType ResourceType { get; set; }
}
下面转换为表达式的代码适用于简单类型,例如 Displayname 属性。表达式将类似于:
x => x.DisplayName == "ValueEnteredByUserInTheUI"
但是,当在网格中输入 ResourceType 属性 的值时,表达式最终将类似于:
x => x.ResourceType == "ValueEnteredByUserInTheUI"
我缺少一个转换成这个的步骤:
x => x.ResourceType.Name == "ValueEnteredByuserInTheUI"
任何人都可以在这里指出正确的方向吗?
public Expression<Func<T, bool>> GetExpression<TEntity>(string field, string operation, object value, string ignoreCase)
{
Expression<Func<T, bool>> whereClause = default(Expression<Func<T, bool>>);
// Define lambda
ParameterExpression param = Expression.Parameter(typeof(T), "x");
MemberExpression member = Expression.Property(param, field);
// Get property type
Type propertyType = member.Type;
// Get converter for type
TypeConverter converter = TypeDescriptor.GetConverter(propertyType);
// Convert property to type
var result = converter.ConvertFrom(value.ToString());
// Convert value to constant value
ConstantExpression constant = Expression.Constant(result);
Expression comparingExpression = default(BinaryExpression);
switch (operation)
{
case "like":
comparingExpression = Expression.Equal(member, Expression.Convert(constant, member.Type));
break;
default:
break;
}
var lambda = Expression.Lambda<Func<T, bool>>(comparingExpression, param);
whereClause = whereClause == default(Expression<Func<T, bool>>) ? lambda : NewPredicateBuilder.And(whereClause, lambda);
return whereClause;
}
显然没有多少人热衷于表达。无论如何,我已经为这个问题创建了一个解决方法。我在方法中添加了另一个参数,指示根对象的复杂 属性 的 属性 名称。
// Get property of root object
MemberExpression member = Expression.Property(param, field);
// Get property of property
MemberExpression memberField = Expression.PropertyOrField(member, complexProperty);
它的可扩展性不是很好,也不是通用的,但现在就可以了。
我有一个场景,我从客户端网格的配置动态创建 WHERE 子句。客户端将一些 json 发送到服务器,然后我对其进行解析并随后转换为表达式,以便它可以作为 where 子句传递到存储库中。
目前我正在努力为复杂的 属性 类型创建表达式,例如:
public partial class Resource
{
public string DisplayName { get; set; }
public virtual ResourceType ResourceType { get; set; }
}
下面转换为表达式的代码适用于简单类型,例如 Displayname 属性。表达式将类似于:
x => x.DisplayName == "ValueEnteredByUserInTheUI"
但是,当在网格中输入 ResourceType 属性 的值时,表达式最终将类似于:
x => x.ResourceType == "ValueEnteredByUserInTheUI"
我缺少一个转换成这个的步骤:
x => x.ResourceType.Name == "ValueEnteredByuserInTheUI"
任何人都可以在这里指出正确的方向吗?
public Expression<Func<T, bool>> GetExpression<TEntity>(string field, string operation, object value, string ignoreCase)
{
Expression<Func<T, bool>> whereClause = default(Expression<Func<T, bool>>);
// Define lambda
ParameterExpression param = Expression.Parameter(typeof(T), "x");
MemberExpression member = Expression.Property(param, field);
// Get property type
Type propertyType = member.Type;
// Get converter for type
TypeConverter converter = TypeDescriptor.GetConverter(propertyType);
// Convert property to type
var result = converter.ConvertFrom(value.ToString());
// Convert value to constant value
ConstantExpression constant = Expression.Constant(result);
Expression comparingExpression = default(BinaryExpression);
switch (operation)
{
case "like":
comparingExpression = Expression.Equal(member, Expression.Convert(constant, member.Type));
break;
default:
break;
}
var lambda = Expression.Lambda<Func<T, bool>>(comparingExpression, param);
whereClause = whereClause == default(Expression<Func<T, bool>>) ? lambda : NewPredicateBuilder.And(whereClause, lambda);
return whereClause;
}
显然没有多少人热衷于表达。无论如何,我已经为这个问题创建了一个解决方法。我在方法中添加了另一个参数,指示根对象的复杂 属性 的 属性 名称。
// Get property of root object
MemberExpression member = Expression.Property(param, field);
// Get property of property
MemberExpression memberField = Expression.PropertyOrField(member, complexProperty);
它的可扩展性不是很好,也不是通用的,但现在就可以了。