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