private Expression GetExpression(ParameterExpression param, ConditionItem item) { //属性表达式 LambdaExpression exp = GetPropertyLambdaExpression(item, param); //如果有特殊类型处理,则进行处理,暂时不关注 foreach (var provider in TransformProviders) { if (provider.Match(item, exp.Body.Type)) { return(GetGroupExpression(param, provider.Transform(item, exp.Body.Type), Expression.AndAlso)); } } //常量表达式 var constant = ChangeTypeToExpression(item, exp.Body.Type); //以判断符或方法连接 return(ExpressionDict[item.Method](exp.Body, constant)); }
private static void AddSearchItem(QueryModel model, string key, string val) { string field = "", prefix = "", orGroup = "", method = ""; var keywords = key.Split(']', ')', '}'); //将Html中的name分割为我们想要的几个部分 foreach (var keyword in keywords) { if (Char.IsLetterOrDigit(keyword[0])) { field = keyword; } var last = keyword.Substring(1); if (keyword[0] == '(') { prefix = last; } if (keyword[0] == '[') { method = last; } if (keyword[0] == '{') { orGroup = last; } } if (string.IsNullOrEmpty(method)) { return; } if (!string.IsNullOrEmpty(field)) { var item = new ConditionItem { Field = field, Value = val.Trim(), Prefix = prefix, OrGroup = orGroup, Method = (QueryMethod)Enum.Parse(typeof(QueryMethod), method) }; model.Items.Add(item); } }
private LambdaExpression GetPropertyLambdaExpression(ConditionItem item, ParameterExpression param) { //获取每级属性如c.Users.Proiles.UserId var props = item.Field.Split('.'); Expression propertyAccess = param; var typeOfProp = typeof(T); int i = 0; do { PropertyInfo property = typeOfProp.GetProperty(props[i]); if (property == null) { return(null); } typeOfProp = property.PropertyType; propertyAccess = Expression.MakeMemberAccess(propertyAccess, property); i++; } while (i < props.Length); return(Expression.Lambda(propertyAccess, param)); }