Я пытаюсь выяснить способ структурирования своих данных, чтобы он был совместимым с моделью. Моя проблема в том, что я должен создать фильтр запросов, который может представлять несколько выражений в данных.
Например:
x = > (x.someProperty == true & x.someOtherProperty == false) || x.UserId == 2
x = > (x.someProperty & x.anotherProperty) || (x.userId == 3 & x.userIsActive)
Я создал эту структуру, которая представляет все выражения в порядке, мой вопрос, как я могу сделать это так, чтобы свойство Model Bindable
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 как решение, но, как требование, я не могу
Есть ли способ, которым я могу усовершенствовать эту структуру, чтобы она все еще представляла все простое выражение, будучи моделью Bindable? или есть простой способ применить эту структуру так, чтобы она работала с привязкой к модели?
ИЗМЕНИТЬ На всякий случай, когда кто-то задается вопросом, мой выражающий строитель имеет белый список выражений членов, который он фильтрует. Работа с динамической фильтрацией Я просто ищу способ привязки этой структуры, естественно, чтобы мой контроллер мог взять QueryTreeBranch или принять структуру, которая точно представляет одни и те же данные.
public class FilterController
{
[HttpGet]
[ReadRoute("")]
public Entity[] GetList(QueryTreeBranch<Entity> queryRoot)
{
//queryRoot no bind :/
}
}
В настоящее время IFilterResolver имеет 2 реализации, которые необходимо выбирать динамически на основе данных, переданных
Я ищу решение, наиболее подходящее для рамки WebApi/MVC. Предпочтительный, который НЕ требует, чтобы я адаптировал вход к другой структуре, чтобы генерировать мое выражение