/// <summary> /// 用==表示值被更改 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <param name="expression"></param> public static void Change <T>(this T obj, Expression <Func <T, bool> > expression) where T : CRL.IModel, new() { if (expression.Body is BinaryExpression) { var Reflection = ReflectionHelper.GetInfo <T>(); BinaryExpression be = ((BinaryExpression)expression.Body); MemberExpression mExp = (MemberExpression)be.Left; string name = mExp.Member.Name; var right = be.Right; object value; if (right is ConstantExpression) { ConstantExpression cExp = (ConstantExpression)right; value = cExp.Value; } else { value = ConstantValueVisitor.GetParameExpressionValue(right); //value = Expression.Lambda(right).Compile().DynamicInvoke(); } //更改对象值 var pro = TypeCache.GetProperties(typeof(T), true); var field = pro[name]; //field.TupleSetValue<T>(obj, value); Reflection.GetAccessor(field.MemberName).Set((T)obj, value); obj.SetChanges(name, value); } else { obj.Change <T, bool>(expression); } }
private IEnumerable <string> GetFunctionAliases(IParameterMetadataProvider ipmp) { if (ipmp == null || ipmp.Body.ParamBlock == null) { yield break; } var attributes = ipmp.Body.ParamBlock.Attributes; foreach (var attributeAst in attributes) { var attributeType = attributeAst.TypeName.GetReflectionAttributeType(); if (attributeType == typeof(AliasAttribute)) { var cvv = new ConstantValueVisitor { AttributeArgument = true }; for (int i = 0; i < attributeAst.PositionalArguments.Count; i++) { yield return(Compiler._attrArgToStringConverter.Target(Compiler._attrArgToStringConverter, attributeAst.PositionalArguments[i].Accept(cvv))); } } } }
/// <summary> /// 按匿名表达式更新 /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="expression"></param> /// <param name="newExpress"></param> /// <returns></returns> public int Update <TResult>(Expression <Func <T, bool> > expression, Expression <Func <T, TResult> > newExpress) { var c = new ParameCollection(); if (newExpress.Body is NewExpression) { var newExp = newExpress.Body as NewExpression; for (int i = 0; i < newExp.Members.Count; i++) { var m = newExp.Members[i]; var v = newExp.Arguments[i]; bool cos; var value = ConstantValueVisitor.GetMemberExpressionValue(v, out cos); c.Add(m.Name, value); } } else if (newExpress.Body is MemberInitExpression) { var memberInitExp = (newExpress.Body as MemberInitExpression); foreach (MemberAssignment m in memberInitExp.Bindings) { bool cos; var value = ConstantValueVisitor.GetMemberExpressionValue(m.Expression, out cos); c.Add(m.Member.Name, value); } } var db = DBExtend; var n = db.Update(expression, c); return(n); }
List <TModel> QueryFromCacheBase(Expression <Func <TModel, bool> > expression, out int total, int pageIndex = 0, int pageSize = 0) { total = 0; #region KEY查找 if (expression.Body is BinaryExpression) { var binary = expression.Body as BinaryExpression; if (binary.NodeType == ExpressionType.Equal) { if (binary.Left is MemberExpression) { var member = binary.Left as MemberExpression; var primaryKey = TypeCache.GetTable(typeof(TModel)).PrimaryKey.MemberName; if (member.Member.Name.ToUpper() == primaryKey.ToUpper()) { var value = ConstantValueVisitor.GetParameExpressionValue(binary.Right).ToString(); //var value = (int)Expression.Lambda(binary.Right).Compile().DynamicInvoke(); var all = GetCache(CacheQuery()); if (all == null) { return(new List <TModel>()); } if (all.ContainsKey(value)) { total = 1; return(new List <TModel>() { all[value] }); } return(new List <TModel>()); } } } } #endregion var predicate = expression.Compile(); IEnumerable <TModel> data; int cacheTotal = AllCache.Count(); if (CacheQueryAsParallel && cacheTotal > 100000) { data = AllCache.AsParallel().Where(predicate); } else { data = AllCache.Where(predicate); } total = data.Count(); if (pageIndex > 0) { //var data2 = Base.CutList(data, pageIndex, pageSize); var data2 = data.Page(pageIndex, pageSize).ToList(); return(data2); } return(data.ToList()); }
List <TModel> QueryFromCacheBase(Expression <Func <TModel, bool> > expression, out int total, int pageIndex = 0, int pageSize = 0) { total = 0; #region KEY查找 bool b; var a = idExpressionCache.TryGetValue(expression.Body.ToString(), out b); if (a) { var binary = expression.Body as BinaryExpression; var value = LambdaQuery.ConstantValueVisitor.GetParameExpressionValue(binary.Right); var list = QueryFormCacheById(value); total = list.Count(); return(list); } if (expression.Body is BinaryExpression) { var binary = expression.Body as BinaryExpression; if (binary.NodeType == ExpressionType.Equal) { if (binary.Left is MemberExpression) { var member = binary.Left as MemberExpression; var primaryKey = TypeCache.GetTable(typeof(TModel)).PrimaryKey.MemberName; if (member.Member.Name.ToUpper() == primaryKey.ToUpper()) { idExpressionCache[expression.Body.ToString()] = true; var value = ConstantValueVisitor.GetParameExpressionValue(binary.Right); var list = QueryFormCacheById(value); total = list.Count(); return(list); } } } } #endregion var predicate = expression.Compile(); IEnumerable <TModel> data; int cacheTotal = AllCache.Count(); if (CacheQueryAsParallel && cacheTotal > 100000) { data = AllCache.AsParallel().Where(predicate); } else { data = AllCache.Where(predicate); } total = data.Count(); if (pageIndex > 0) { //var data2 = Base.CutList(data, pageIndex, pageSize); var data2 = data.Page(pageIndex, pageSize).ToList(); return(data2); } return(data.ToList()); }
List <T> QueryFromCacheBase(Expression <Func <T, bool> > expression, out int total, int pageIndex = 0, int pageSize = 0) { total = 0; #region KEY查找 if (expression.Body is BinaryExpression) { var binary = expression.Body as BinaryExpression; if (binary.NodeType == ExpressionType.Equal) { if (binary.Left is MemberExpression) { var member = binary.Left as MemberExpression; var primaryKey = TypeCache.GetTable(typeof(T)).PrimaryKey.MemberName; if (member.Member.Name == primaryKey) { var value = ConstantValueVisitor.GetParameExpressionValue(binary.Right); var item = QueryFormCacheById(value); var list = new List <T>(); if (item != null) { list.Add(item); } total = list.Count(); return(list); } } } } #endregion var predicate = expression.Compile(); IEnumerable <T> data; if (CacheQueryAsParallel && AllCacheCount > 100000) { data = AllCache.AsParallel().Where(predicate); } else { data = AllCache.Where(predicate); } total = data.Count(); if (pageIndex > 0) { //var data2 = Base.CutList(data, pageIndex, pageSize); var data2 = data.Page(pageIndex, pageSize).ToList(); return(data2); } return(data.ToList()); }
CRLExpression MemberExpressionHandler(Expression exp, ExpressionType?nodeType = null) { MemberExpression mExp = (MemberExpression)exp; if (mExp.Expression != null && mExp.Expression.NodeType == ExpressionType.Parameter) //like b.Name==b.Name1 或b.Name { return(new CRLExpression() { Type = CRLExpressionType.Name, Data = mExp.Member.Name }); } //var obj = Expression.Lambda(mExp).Compile().DynamicInvoke(); var obj = ConstantValueVisitor.GetParameExpressionValue(mExp); if (obj is Enum) { obj = (int)obj; } return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); }
CRLExpression MethodCallExpressionHandler(Expression exp, ExpressionType?nodeType = null, bool firstLevel = false) { MethodCallExpression mcExp = (MethodCallExpression)exp; if (mcExp.Object is MemberExpression) { var mExp = mcExp.Object as MemberExpression; if (mExp.Expression.NodeType != ExpressionType.Parameter) { //not like b.BarCode.Contains("abc") //按变量或常量编译值 var obj = ConstantValueVisitor.GetParameExpressionValue(exp); return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); } } else if (mcExp.Object is ConstantExpression) { //var cExp = mcExp.Object as ConstantExpression; //like b.BarCode == aa() var obj = ConstantValueVisitor.GetParameExpressionValue(exp); return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); } string methodName = mcExp.Method.Name; string field = ""; List <object> args = new List <object>(); if (mcExp.Object == null) { field = RouteExpressionHandler(mcExp.Arguments[0]).Data.ToString(); } else { field = mcExp.Object.ToString().Split('.')[1]; if (mcExp.Arguments.Count > 0) { var obj = ConstantValueVisitor.GetParameExpressionValue(mcExp.Arguments[0]); args.Add(obj); } //args.Add(Expression.Lambda(mcExp.Arguments[0]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 1) { for (int i = 1; i < mcExp.Arguments.Count; i++) { var obj = ConstantValueVisitor.GetParameExpressionValue(mcExp.Arguments[i]); args.Add(obj); } } if (methodName == "Parse") { methodName = string.Format("To{0}", mcExp.Method.DeclaringType.Name); } var methodCall = string.Format("{0}|{1}|{2}", field, methodName, string.Join(",", args)); return(new CRLExpression() { Type = CRLExpressionType.MethodCall, Data = methodCall }); throw new NotSupportedException("暂不支持"); }
CRLExpression RouteExpressionHandler(Expression exp, int level = 0) { if (exp is BinaryExpression) { BinaryExpression be = (BinaryExpression)exp; level += 1; return(BinaryExpressionHandler(be.Left, be.Right, be.NodeType, level)); } else if (exp is MemberExpression) { MemberExpression mExp = (MemberExpression)exp; if (mExp.Expression != null && mExp.Expression.NodeType == ExpressionType.Parameter) //like b.Name==b.Name1 或b.Name { return(new CRLExpression() { Type = CRLExpressionType.Name, Data = mExp.Member.Name }); } //var obj = Expression.Lambda(mExp).Compile().DynamicInvoke(); var obj = ConstantValueVisitor.GetParameExpressionValue(mExp); if (obj is Enum) { obj = (int)obj; } return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); } else if (exp is NewArrayExpression) { #region 数组 NewArrayExpression naExp = (NewArrayExpression)exp; StringBuilder sb = new StringBuilder(); foreach (Expression expression in naExp.Expressions) { sb.AppendFormat(",{0}", RouteExpressionHandler(expression)); } //return sb.Length == 0 ? "" : sb.Remove(0, 1).ToString(); return(new CRLExpression() { Type = CRLExpressionType.Value, Data = sb.Length == 0 ? "" : sb.Remove(0, 1).ToString() }); #endregion } else if (exp is MethodCallExpression) { MethodCallExpression mcExp = (MethodCallExpression)exp; if (mcExp.Object is MemberExpression) { var mExp = mcExp.Object as MemberExpression; if (mExp.Expression.NodeType != ExpressionType.Parameter) { //not like b.BarCode.Contains("abc") //按变量或常量编译值 var obj = ConstantValueVisitor.GetParameExpressionValue(exp); return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); } } else if (mcExp.Object is ConstantExpression) { //var cExp = mcExp.Object as ConstantExpression; //like b.BarCode == aa() var obj = ConstantValueVisitor.GetParameExpressionValue(exp); return(new CRLExpression() { Type = CRLExpressionType.Value, Data = obj }); } string methodName = mcExp.Method.Name; string field = ""; List <object> args = new List <object>(); if (mcExp.Object == null) { field = RouteExpressionHandler(mcExp.Arguments[0]).ToString(); } else { field = mcExp.Object.ToString().Split('.')[1]; var obj = ConstantValueVisitor.GetParameExpressionValue(mcExp.Arguments[0]); args.Add(obj); //args.Add(Expression.Lambda(mcExp.Arguments[0]).Compile().DynamicInvoke()); } if (mcExp.Arguments.Count > 1) { for (int i = 1; i < mcExp.Arguments.Count; i++) { var obj = ConstantValueVisitor.GetParameExpressionValue(mcExp.Arguments[i]); args.Add(obj); } } var methodCall = string.Format("{0}|{1}|{2}", field, methodName, string.Join(",", args)); return(new CRLExpression() { Type = CRLExpressionType.MethodCall, Data = methodCall }); throw new NotSupportedException("暂不支持"); } else if (exp is ConstantExpression) { #region 常量 ConstantExpression cExp = (ConstantExpression)exp; object value; if (cExp.Value == null) { value = null; } else { value = cExp.Value.ToString(); } //return value; return(new CRLExpression() { Type = CRLExpressionType.Value, Data = value }); #endregion } else if (exp is UnaryExpression) { UnaryExpression ue = ((UnaryExpression)exp); level += 1; return(RouteExpressionHandler(ue.Operand, level)); } return(null); }