public void GetWhereExpressionTest() { WhereConditionArguments <TestClassA> whereConditionArguments = new WhereConditionArguments <TestClassA>(); whereConditionArguments.SpliceMode = Enums.EnumSpliceMode.AndAlso; whereConditionArguments.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.A), Value = "1", MatchMode = Enums.EnumMatchMode.Equal }); whereConditionArguments.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.A), Value = "1,2,3,4", MatchMode = Enums.EnumMatchMode.In }); WhereConditionArguments <TestClassA> w2 = new WhereConditionArguments <TestClassA>(); w2.SpliceMode = Enums.EnumSpliceMode.OrElse; w2.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.A), Value = "1", MatchMode = Enums.EnumMatchMode.Equal }); w2.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.B), Value = "1,2,3,4", MatchMode = Enums.EnumMatchMode.In }); whereConditionArguments.InnerWhereConditionArguments.Add(w2); Expression <Func <TestClassA, bool> > a = whereConditionArguments.GetWhereLambdaExpression(); }
public void GetWhereExpressionTest() { WhereConditionArguments <TestClassA> whereConditionArguments = new WhereConditionArguments <TestClassA>(); whereConditionArguments.SpliceMode = Enums.EnumSpliceMode.AndAlso; whereConditionArguments.WhereConditions.Add(new WhereCondition() { Key = "A24235634", Value = "", MatchMode = Enums.EnumMatchMode.Equal }); whereConditionArguments.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.A), Value = "1", MatchMode = Enums.EnumMatchMode.NotEqual }); whereConditionArguments.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.A), Value = new int[] { 1, 2, 3, 4 }, MatchMode = Enums.EnumMatchMode.In }); WhereConditionArguments <TestClassA> w2 = new WhereConditionArguments <TestClassA> { SpliceMode = Enums.EnumSpliceMode.OrElse }; w2.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.B), Value = "30", MatchMode = Enums.EnumMatchMode.NotEqual }); w2.WhereConditions.Add(new WhereCondition() { Key = "DDDDD", Value = "", MatchMode = Enums.EnumMatchMode.In }); w2.WhereConditions.Add(new WhereCondition() { Key = nameof(TestClassA.A), Value = new int[] { 1, 2, 3, 4 }, MatchMode = Enums.EnumMatchMode.In }); whereConditionArguments.InnerWhereConditionArguments.Add(w2); whereConditionArguments = JsonConvert.DeserializeObject <WhereConditionArguments <TestClassA> >(JsonConvert.SerializeObject(whereConditionArguments)); List <WhereConditionFilterAttribute> whereConditionFilterAttributes = new List <WhereConditionFilterAttribute>(); whereConditionFilterAttributes.Add(new WhereConditionFilterAttribute(Enums.EnumMatchMode.All, nameof(TestClassA.A), nameof(TestClassA.B))); WhereConditionArgumentsInterpreter whereConditionArgumentsInterpret = new WhereConditionArgumentsInterpreter(); _ = whereConditionArgumentsInterpret.ApplyFilter(whereConditionArguments, whereConditionFilterAttributes); WhereConditionArguments b = whereConditionArgumentsInterpret.Parse(whereConditionArguments); whereConditionArguments = b as WhereConditionArguments <TestClassA>; Expression <Func <TestClassA, bool> > c = whereConditionArguments.GetWhereLambdaExpression(); }
/// <summary> /// 解析数据 /// </summary> /// <param name="whereConditionArguments"></param> /// <returns></returns> public virtual WhereConditionArguments Parse(WhereConditionArguments whereConditionArguments) { if (whereConditionArguments == null) { throw new ArgumentNullException(nameof(whereConditionArguments)); } List <WhereCondition> removeList = new List <WhereCondition>(); foreach (WhereCondition item in whereConditionArguments.WhereConditions.Where(item => !(item is null))) { WhereCondition whereCondition = item; if ((whereCondition.MatchMode & (EnumMatchMode.Between | EnumMatchMode.NotBetween | EnumMatchMode.In | EnumMatchMode.NotIn)) == whereCondition.MatchMode) { IEnumerable <object> targetList; Type type = whereCondition.Value?.GetType(); if (type is null) { continue; } targetList = type == typeof(string) ? JsonConvert.DeserializeObject <List <object> >(((string)whereCondition.Value)?.Trim()) : whereCondition.Value is IEnumerable array?array.Cast <object>() : null; if (targetList == null || ((whereCondition.MatchMode & (EnumMatchMode.Between | EnumMatchMode.NotBetween)) == whereCondition.MatchMode && targetList.Count() != 2)) { removeList.Add(item); } whereCondition.Value = targetList; } else if ((whereCondition.MatchMode & EnumMatchMode.Like) == EnumMatchMode.Like) { //No conversion required } } foreach (WhereConditionArguments item in whereConditionArguments.InnerWhereConditionArguments) { if (item is WhereConditionArguments innerWhereConditionArguments) { innerWhereConditionArguments = Parse(innerWhereConditionArguments); } } removeList.ForEach(item => whereConditionArguments.WhereConditions.Remove(item)); return(whereConditionArguments); }
public async Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); } string modelName = bindingContext.BinderModelName; if (string.IsNullOrEmpty(modelName)) { modelName = bindingContext.ModelMetadata.Name; } ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); if (valueProviderResult == ValueProviderResult.None) { await Task.CompletedTask; return; } bindingContext.ModelState.SetModelValue(modelName, valueProviderResult); string requestString = valueProviderResult.FirstValue; if (string.IsNullOrEmpty(requestString)) { await Task.CompletedTask; return; } WhereConditionArguments whereParameterArguments = JsonConvert.DeserializeObject(requestString, bindingContext.ModelType) as WhereConditionArguments; try { IEnumerable <WhereConditionFilterAttribute> whereParameterAttributes = ((DefaultModelMetadata)bindingContext.ModelMetadata).Attributes.ParameterAttributes .Where(attr => attr.GetType() == typeof(WhereConditionFilterAttribute)).Select(attr => attr as WhereConditionFilterAttribute); WhereConditionArgumentsInterpreter whereConditionArgumentsInterpret = new WhereConditionArgumentsInterpreter(); whereParameterArguments = whereConditionArgumentsInterpret.ApplyFilter(whereParameterArguments, whereParameterAttributes?.ToList()); whereParameterArguments = whereConditionArgumentsInterpret.Parse(whereParameterArguments); } catch (Exception ex) { bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, ex.Message); await Task.CompletedTask; return; } bindingContext.Result = ModelBindingResult.Success(whereParameterArguments); await Task.CompletedTask; return; }
/// <summary> /// 应用过滤器 /// </summary> /// <param name="whereConditionArguments">待处理参数</param> /// <param name="whereConditionFilterList">过滤器列表</param> /// <returns></returns> public virtual WhereConditionArguments ApplyFilter(WhereConditionArguments whereConditionArguments, List <WhereConditionFilterAttribute> whereConditionFilterList = null) { if (whereConditionArguments == null) { throw new ArgumentNullException(nameof(whereConditionArguments)); } //没有过滤器约束则不进行任何处理 if (whereConditionFilterList == null || whereConditionFilterList.Count == 0) { return(whereConditionArguments); } List <WhereCondition> removeList = new List <WhereCondition>(); foreach (WhereCondition item in whereConditionArguments.WhereConditions) { if (!(item is WhereCondition whereCondition)) { continue; } if (!whereConditionFilterList.Any(f => //若当前被审查元素不满足以下条件,则应被过滤 (f.Keys == null || f.Keys.Contains(whereCondition.Key)) //未定义或者已包含 && (f.AllowMatchPattern & whereCondition.MatchMode) == whereCondition.MatchMode) //允许的匹配模式能够匹配 ) { removeList.Add(item); } } foreach (WhereConditionArguments item in whereConditionArguments.InnerWhereConditionArguments) { if (item is WhereConditionArguments innerWhereConditionArguments) { innerWhereConditionArguments = ApplyFilter(innerWhereConditionArguments, whereConditionFilterList); } } removeList.ForEach(item => whereConditionArguments.WhereConditions.Remove(item)); return(whereConditionArguments); }