我正在尝试找出一种结构化数据的方法,使其可以进行模型绑定。我的问题是我必须创建一个查询过滤器,它可以表示数据中的多个表达式。
例如:
x => (x.someProperty == true && x.someOtherProperty == false) || x.UserId == 2
x => (x.someProperty && x.anotherProperty) || (x.userId == 3 && x.userIsActive)
我已经创建了这个结构来表示所有的表达式,但我的问题是如何使其成为属性模型可绑定的。
我的左右成员只需要能够被解析为IResolvable,但模型绑定器只绑定具体类型。我知道我可以编写自定义模型绑定器,但我更喜欢有一个可用的结构。
我知道我可以将json作为解决方案传递,但作为要求,我不能这样做。
有没有办法优化这个结构,使其仍然能够表示所有简单表达式,同时可以进行模型绑定?还是有一种简单的方法可以应用这个结构,使其与模型绑定器配合使用?
编辑:以防万一,我的表达式生成器有一个白名单成员表达式过滤器。动态过滤工作只是在寻找一种自然地绑定此结构的方式,以便我的控制器可以接收QueryTreeBranch或接收准确表示相同数据的结构。
例如:
x => (x.someProperty == true && x.someOtherProperty == false) || x.UserId == 2
x => (x.someProperty && x.anotherProperty) || (x.userId == 3 && x.userIsActive)
我已经创建了这个结构来表示所有的表达式,但我的问题是如何使其成为属性模型可绑定的。
public enum FilterCondition
{
Equals,
}
public enum ExpressionCombine
{
And = 0,
Or
}
public interface IFilterResolver<T>
{
Expression<Func<T, bool>> ResolveExpression();
}
public class QueryTreeNode<T> : IFilterResolver<T>
{
public string PropertyName { get; set; }
public FilterCondition FilterCondition { get; set; }
public string Value { get; set; }
public bool isNegated { get; set; }
public Expression<Func<T, bool>> ResolveExpression()
{
return this.BuildSimpleFilter();
}
}
//TODO: rename this class
public class QueryTreeBranch<T> : IFilterResolver<T>
{
public QueryTreeBranch(IFilterResolver<T> left, IFilterResolver<T> right, ExpressionCombine combinor)
{
this.Left = left;
this.Right = right;
this.Combinor = combinor;
}
public IFilterResolver<T> Left { get; set; }
public IFilterResolver<T> Right { get; set; }
public ExpressionCombine Combinor { get; set; }
public Expression<Func<T, bool>> ResolveExpression()
{
var leftExpression = Left.ResolveExpression();
var rightExpression = Right.ResolveExpression();
return leftExpression.Combine(rightExpression, Combinor);
}
}
我的左右成员只需要能够被解析为IResolvable,但模型绑定器只绑定具体类型。我知道我可以编写自定义模型绑定器,但我更喜欢有一个可用的结构。
我知道我可以将json作为解决方案传递,但作为要求,我不能这样做。
有没有办法优化这个结构,使其仍然能够表示所有简单表达式,同时可以进行模型绑定?还是有一种简单的方法可以应用这个结构,使其与模型绑定器配合使用?
编辑:以防万一,我的表达式生成器有一个白名单成员表达式过滤器。动态过滤工作只是在寻找一种自然地绑定此结构的方式,以便我的控制器可以接收QueryTreeBranch或接收准确表示相同数据的结构。
public class FilterController
{
[HttpGet]
[ReadRoute("")]
public Entity[] GetList(QueryTreeBranch<Entity> queryRoot)
{
//queryRoot no bind :/
}
}
目前IFilterResolver有两个实现,需要根据传递的数据动态选择
我正在寻找最接近WebApi / MVC框架的开箱即用解决方案。最好不需要我将输入调整为另一种结构以生成表达式