/// <summary>
        ///     更新缓存
        /// </summary>
        /// <param name="assign">赋值表达式树</param>
        /// <param name="whereExp">条件</param>
        private int UpdateCache(Expression assign, params Expression <Func <TEntity, bool> >[] whereExp)
        {
            // 更新本地缓存(立即执行,在事务中延迟会数据不同步)
            // 缓存库中的所有数据
            var lstCacheLibrary = Cache.ToList();
            // 筛选出要更新的数据列表
            var lstUpdate = whereExp.Aggregate(lstCacheLibrary, (current, exp) => current.FindAll(new Predicate <TEntity>(exp.Compile())));

            // 筛选条件
            if (!lstUpdate.Any())
            {
                return(0);
            }

            // 获取赋值表达式树中的每一项操作赋值符号树
            var lstLambda = new GetBinaryVisitor().Visit(assign);

            foreach (var ex in lstLambda)
            {
                // 转换成Lambda表达式(用于下面的传入执行)
                // 获取实体类的表达式参数
                var entityParamter = new GetParamVisitor().Visit(ex).FirstOrDefault();
                var lambda         = Expression.Lambda <Action <TEntity> >(ex, entityParamter).Compile();
                foreach (var updateEntity in lstUpdate)
                {
                    lambda(updateEntity);
                }
            }

            // 更新到接口操作的缓存保存中
            _dataCache.Update(lstCacheLibrary);
            return(lstCacheLibrary.Count);
        }
Beispiel #2
0
        /// <summary>
        /// 添加或者减少某个字段(支持延迟加载)
        /// </summary>
        public void AddUp()
        {
            var assign = _set.Queue.ExpBuilder.ExpAssign;
            var exp    = (Expression <Func <TEntity, bool> >)_set.Queue.ExpBuilder.ExpWhere;

            _set.AddUp();

            // 更新本地缓存
            _set.QueueManger.AppendLazy(_set.Name, _set.SetState, (queue) =>
            {
                var lst = Cache;
                if (exp != null)
                {
                    lst = lst.ToList().FindAll(exp.Compile().ToPredicate());
                }

                // 获取可以转换成Lambda的表达式树
                var lstLambda = new GetBinaryVisitor().Visit(assign);
                foreach (var ex in lstLambda)
                {
                    // 获取现有参数表达式树
                    var paramter = new GetParamVisitor().Visit(ex).FirstOrDefault();
                    // 转换成Lambda表达式
                    var lambda = Expression.Lambda <Action <TEntity> >(ex, paramter).Compile();
                    foreach (var updateEntity in lst)
                    {
                        lambda(updateEntity);
                    }
                }
            }, !_set.Context.IsMergeCommand, false);
        }
        /// <summary>
        ///     动态创建一个 o.ID == value的表达式树
        /// </summary>
        /// <typeparam name="TEntity">实体</typeparam>
        /// <param name="val">右值</param>
        /// <param name="expType">匹配符号类型</param>
        /// <param name="memberName">左边ID成员名称</param>
        public static Expression <Func <TEntity, bool> > CreateBinaryExpression <TEntity>(object val, MemberExpression memberName, ExpressionType expType = ExpressionType.Equal) where TEntity : class, new()
        {
            var oParam = new GetParamVisitor().Visit(memberName).FirstOrDefault();
            var right  = Expression.Convert(Expression.Constant(val), memberName.Type);

            BinaryExpression where = null;
            switch (expType)
            {
            case ExpressionType.Equal:
                where = Expression.Equal(memberName, right);
                break;

            case ExpressionType.NotEqual:
                where = Expression.NotEqual(memberName, right);
                break;

            case ExpressionType.GreaterThan:
                where = Expression.GreaterThan(memberName, right);
                break;

            case ExpressionType.GreaterThanOrEqual:
                where = Expression.GreaterThanOrEqual(memberName, right);
                break;

            case ExpressionType.LessThan:
                where = Expression.LessThan(memberName, right);
                break;

            case ExpressionType.LessThanOrEqual:
                where = Expression.LessThanOrEqual(memberName, right);
                break;
            }
            return((Expression <Func <TEntity, bool> >)Expression.Lambda(where, oParam));
        }
Beispiel #4
0
        static void Main(string[] args)
        {
            Expression <Func <UserVO, object> > fieldName = o => new { o.ID, o.LogCount, o.LoginIP };
            var type = new GetParamVisitor().Visit(fieldName).Select(o => o.Type).First();

            Table.Data.UserRole.AddUp(1, o => o.UserCount, 1);
            SpeedTest.Initialize();
            //TestTableInstance(1);
            //TestSetValueCache(1);
            //TestGetValueCache(1);
            //TestToList(1);
            Console.Clear();
            //Console.WriteLine("请按任意键开始测试");
            //Console.ReadKey();
            //Console.Clear();

            //#if DEBUG
            //            Console.WriteLine("请在Release模式下进行");
            //            Console.ReadKey();
            //            return;
            //#endif
            //TestTableInstance();
            //TestSetValueCache();
            //TestGetValueCache();
            //TestToList();
            TestDynamicClass();
            Console.ReadKey();
        }
Beispiel #5
0
        /// <summary>
        /// 动态创建一个 List.Contains(o.ID)的表达式树
        /// </summary>
        /// <typeparam name="TEntity">实体</typeparam>
        /// <param name="val">右值</param>
        /// <param name="memberName">左边ID成员名称</param>
        public static Expression <Func <TEntity, bool> > CreateContainsBinaryExpression <TEntity>(object val, MemberExpression memberName) where TEntity : class, new()
        {
            var oParam = new GetParamVisitor().Visit(memberName).FirstOrDefault();
            var member = memberName.Type.IsGenericType && memberName.Type.GetGenericTypeDefinition() == typeof(Nullable <>) ? (Expression)Expression.Call(memberName, memberName.Type.GetMethod("GetValueOrDefault", new Type[] { })) : memberName;
            var right  = Expression.Constant(val, val.GetType());

            var where = Expression.Call(right, right.Type.GetMethod("Contains"), member);
            return((Expression <Func <TEntity, bool> >)Expression.Lambda(where, oParam));
        }
Beispiel #6
0
        /// <summary>
        /// 合并NewExpression
        /// </summary>
        /// <param name="exps">要合并的NewExpression</param>
        public static Expression MergeNewExpression(params Expression[] exps)
        {
            // 获取表达式树中实体类型
            var parentType = new GetParamVisitor().Visit(exps[0]).Select(o => o.Type).First();

            // 取得所有PropertyInfo
            var lst = new GetMemberVisitor().Visit(exps).Select(o => (PropertyInfo)o.Member);

            // 构造函数参数类型
            var lstPropertyType = lst.Select(o => o.PropertyType).ToArray();

            // 根据取得的PropertyInfo列表,创建新类型
            var classType = CacheManger.CreateClass(null, lstPropertyType, parentType);
            // 获取新类型的构造函数
            var constructor = classType.GetConstructor(lstPropertyType);

            // 创建构造函数的参数表达式数组
            var constructorParam = BuildConstructorsParameters(classType, lst);

            return(Expression.New(constructor, constructorParam));
        }