示例#1
0
        static async Task <int> UpdateOnly <TEntity>(IDbContext dbContext, TEntity entity, string[] fields, bool @async)
        {
            PublicHelper.CheckNull(dbContext);
            PublicHelper.CheckNull(entity);
            PublicHelper.CheckNull(fields);

            /* 支持 context.UpdateOnly<User>(user, "Name,Age", "NickName"); */
            fields = fields.SelectMany(a => a.Split(',')).Select(a => a.Trim()).ToArray();

            if (fields.Length == 0)
            {
                throw new ArgumentException("fields");
            }

            Type           entityType     = typeof(TEntity);
            TypeDescriptor typeDescriptor = EntityTypeContainer.GetDescriptor(entityType);

            List <MemberBinding> bindings = new List <MemberBinding>();

            ConstantExpression entityConstantExp = Expression.Constant(entity);

            foreach (string field in fields)
            {
                MemberInfo memberInfo         = entityType.GetMember(field)[0];
                var        propertyDescriptor = typeDescriptor.FindPrimitivePropertyDescriptor(memberInfo);

                if (propertyDescriptor == null)
                {
                    throw new ArgumentException(string.Format("Could not find the member '{0}' from entity.", propertyDescriptor.Column.Name));
                }

                Expression       entityMemberAccess = Expression.MakeMemberAccess(entityConstantExp, memberInfo);
                MemberAssignment bind = Expression.Bind(memberInfo, entityMemberAccess);

                bindings.Add(bind);
            }

            ParameterExpression parameter     = Expression.Parameter(entityType, "a");
            Expression          conditionBody = null;

            foreach (PrimitivePropertyDescriptor primaryKey in typeDescriptor.PrimaryKeys)
            {
                Expression propOrField = Expression.PropertyOrField(parameter, primaryKey.Property.Name);
                Expression keyValue    = Expression.MakeMemberAccess(entityConstantExp, primaryKey.Property);
                Expression e           = Expression.Equal(propOrField, keyValue);
                conditionBody = conditionBody == null ? e : Expression.AndAlso(conditionBody, e);
            }

            Expression <Func <TEntity, bool> > condition = Expression.Lambda <Func <TEntity, bool> >(conditionBody, parameter);

            return(await UpdateOnly(dbContext, condition, bindings, @async));
        }
示例#2
0
        static MemberInfo TryGetMapMember(List <MemberInfo> members, string readerName, TypeDescriptor typeDescriptor)
        {
            MemberInfo mapMember = null;

            foreach (MemberInfo member in members)
            {
                string columnName = null;
                if (typeDescriptor != null)
                {
                    PrimitivePropertyDescriptor propertyDescriptor = typeDescriptor.FindPrimitivePropertyDescriptor(member);
                    if (propertyDescriptor != null)
                    {
                        columnName = propertyDescriptor.Column.Name;
                    }
                }

                if (string.IsNullOrEmpty(columnName))
                {
                    ColumnAttribute columnAttribute = member.GetCustomAttribute <ColumnAttribute>();
                    if (columnAttribute != null)
                    {
                        columnName = columnAttribute.Name;
                    }
                }

                if (string.IsNullOrEmpty(columnName))
                {
                    continue;
                }

                if (!string.Equals(columnName, readerName, StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }

                mapMember = member;
                break;
            }

            if (mapMember == null)
            {
                mapMember = members.Find(a => a.Name == readerName);
            }

            if (mapMember == null)
            {
                mapMember = members.Find(a => string.Equals(a.Name, readerName, StringComparison.OrdinalIgnoreCase));
            }

            return(mapMember);
        }