/// <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);
        }
Example #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);
        }