コード例 #1
0
ファイル: QueryableExtensions.cs プロジェクト: WZW10280304/DD
        /// <summary>
        /// 筛选满足条件的项并给指定字段赋值
        /// </summary>
        /// <typeparam name="TAggregateRoot"></typeparam>
        /// <typeparam name="TField"></typeparam>
        /// <param name="item"></param>
        /// <param name="field"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static IQueryable <TAggregateRoot> Set <TAggregateRoot, TField>(this IQueryable <TAggregateRoot> item,
                                                                               Expression <Func <TAggregateRoot, TField> > field, TField value) where TAggregateRoot : class, new()
        {
            if (field != null)
            {
                if (!(field.Body is MemberExpression exp) || field.Parameters.Count == 0)
                {
                    throw new Exception("无效的Lambda表达式");
                }

                var ext = new EmitExtension <TAggregateRoot>();

                ext.BuildEmitMethod(typeof(TAggregateRoot), exp.Member.Name);
                item.ToList().ForEach(x => ext.EmitSetValue(x, value));
            }
            else
            {
                throw new Exception("无效的Lambda表达式");
            }

            return(item);
        }
コード例 #2
0
        public static IQueryable <TAggregateRoot> Set <TAggregateRoot>(this IQueryable <TAggregateRoot> tAggregateRoots,
                                                                       Expression <Func <TAggregateRoot, TAggregateRoot> > tAggregateRoot)
            where TAggregateRoot : class, new()
        {
            if (tAggregateRoot != null)
            {
                var exp = tAggregateRoot.Body as MemberInitExpression;

                if (exp == null || exp.Bindings.Count == 0)
                {
                    throw new Exception("无效的Lambda表达式");
                }

                foreach (var binding in exp.Bindings)
                {
                    var ext = new EmitExtension <TAggregateRoot>();
                    ext.BuildEmitMethod(typeof(TAggregateRoot), binding.Member.Name);

                    var memberAssignment = binding as MemberAssignment;
                    if (memberAssignment == null)
                    {
                        throw new ArgumentException("表达式必须为MemberAssignment");
                    }

                    Expression memberExpression = memberAssignment.Expression;

                    ParameterExpression parameterExpression = null;

                    memberExpression.Visit((ParameterExpression p) =>
                    {
                        parameterExpression = p;
                        return(p);
                    });

                    object value = null;

                    if (parameterExpression == null)
                    {
                        if (memberExpression.NodeType == ExpressionType.Constant)
                        {
                            var constantExpression = memberExpression as ConstantExpression;
                            if (constantExpression == null)
                            {
                                throw new ArgumentException(
                                          "MemberAssignment expression 无效");
                            }
                            value = constantExpression.Value;
                        }
                        else
                        {
                            var lambda = Expression.Lambda(memberExpression, null);
                            value = lambda.Compile().DynamicInvoke();
                        }
                    }
                    else
                    {
                        throw new Exception("无效的Lambda表达式");
                    }
                    tAggregateRoots.ToList().ForEach(x => ext.EmitSetValue(x, value));
                }
            }
            else
            {
                throw new Exception("无效的Lambda表达式");
            }
            return(tAggregateRoots);
        }