Exemplo n.º 1
0
 /// <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);
     }
 }
Exemplo n.º 2
0
        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)));
                    }
                }
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
 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());
 }
Exemplo n.º 5
0
 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());
 }
Exemplo n.º 6
0
 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());
 }
Exemplo n.º 7
0
        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
            });
        }
Exemplo n.º 8
0
        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("暂不支持");
        }
Exemplo n.º 9
0
        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);
        }