private Expression CreateExpressionFromSelectionPack(SelectConditionPack selectConditionPack, ParameterExpression parameter) { var _expressionBuilder = _logicConditionStrategy.GetExpressionBuilder(selectConditionPack.JoinCondition); Expression _finalExpression = _expressionBuilder.Start(); foreach (SelectConditionPack _selectConditionPack in selectConditionPack.SelectConditionPacks) { var _expression = CreateExpressionFromSelectionPack(_selectConditionPack, parameter); _finalExpression = _expressionBuilder.Build(_finalExpression, _expression); } foreach (SelectCondition _selectCondition in selectConditionPack.SelectConditions) { var _expression = CreateExpressionFromCondition(parameter, _selectCondition); _finalExpression = _expressionBuilder.Build(_finalExpression, _expression); } if (selectConditionPack.Not) { _finalExpression = Expression.Not(_finalExpression); } return(_finalExpression); }
private IQueryable <TModel> Apply <TModel>(IQueryable <TModel> queryableData, SelectConditionPack selectConditionPack) { var _parameter = Expression.Parameter(typeof(TModel), "x"); var _expression = CreateExpressionFromSelectionPack(selectConditionPack, _parameter); return(SelectQueryByExpression(queryableData, _expression, _parameter)); }
public void SelectManyWithSubConditions() { // Array using var _context = new DBContext(_dbInit.DbContextOptions); ISelector _selector = new Select.Selector(_serviceProvider); var _filterByString = new SelectConditionPack { SelectConditions = { new SelectCondition { Condition = CompareCondition.Eq, Value = "2", PropertyName = nameof(DataModel.StringValue) }, new SelectCondition { Condition = CompareCondition.Eq, Value = "3", PropertyName = nameof(DataModel.StringValue) } }, JoinCondition = LogicCondition.Or }; var _filterById = new SelectConditionPack { SelectConditions = { new SelectCondition { Condition = CompareCondition.Eq, Value = "2", PropertyName = nameof(DataModel.Id) }, new SelectCondition { Condition = CompareCondition.Eq, Value = "3", PropertyName = nameof(DataModel.Id) } }, JoinCondition = LogicCondition.Or }; var _selectRequest = new TestSelectRequestStruct { Where = new SelectConditionPack { SelectConditions = { new SelectCondition { Condition = CompareCondition.Ge, Value = "2", PropertyName = nameof(DataModel.DoubleValue) }, new SelectCondition { Condition = CompareCondition.Lt, Value = "3.6", PropertyName = nameof(DataModel.FloatValue) } }, SelectConditionPacks = { _filterByString, _filterById }, JoinCondition = LogicCondition.And } }; var _expectedResult = _context.Table.Where(t => t.Id == 2 || t.Id == 3).ToArray(); // Act var _assertedResult = _selector.Apply(_context.Table.AsQueryable(), _selectRequest).ToArray(); // Assert Assert.IsTrue(DataModel.CompareArr(_expectedResult, _assertedResult)); }