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