Я знаю, что это старая ветка, но я также искал похожее решение и решил воспользоваться решением @ Doku-so.Я комментирую, чтобы ответить на вопрос, заданный @Imran Rizvi, я перешел по ссылке @ Doku-so, на которой показана аналогичная реализация.Вопрос Имрана Ризви состоял в том, что он получал сообщение об ошибке, используя предоставленное решение «Не удалось преобразовать лямбда-выражение в тип« Выражение> [] », потому что это не тип делегата».Я хотел предложить небольшое изменение, которое я внес в решение @ Doku-so, которое исправляет эту ошибку в случае, если кто-то еще сталкивается с этим сообщением и решает использовать решение @ Doku-so.
Проблема является вторым аргументом вметод Update,
public int Update(T entity, Expression<Func<T, object>>[] properties).
Чтобы вызвать этот метод с использованием предоставленного синтаксиса ...
Update(Model, d=>d.Name, d=>d.SecondProperty, d=>d.AndSoOn);
Вы должны добавить ключевое слово 'params' перед вторым arugment, как это так.
public int Update(T entity, params Expression<Func<T, object>>[] properties)
или если вы не хотите изменять сигнатуру метода, чтобы вызвать метод Update, вам нужно добавить ключевое слово ' new ', укажитеразмер массива, а затем, наконец, используйте синтаксис инициализатора объекта коллекции для каждого свойства для обновления, как показано ниже.
Update(Model, new Expression<Func<T, object>>[3] { d=>d.Name }, { d=>d.SecondProperty }, { d=>d.AndSoOn });
В примере @ Doku-so он задает массив выражений, поэтому вы должны передатьсвойства для обновления в массиве, потому что для массива вы также должны указать размер массива.Чтобы избежать этого, вы также можете изменить аргумент выражения, чтобы использовать IEnumerable вместо массива.
Вот моя реализация решения @ Doku-so.
public int Update<TEntity>(LcmsEntities dataContext, DbEntityEntry<TEntity> entityEntry, params Expression<Func<TEntity, object>>[] properties)
where TEntity: class
{
entityEntry.State = System.Data.Entity.EntityState.Unchanged;
properties.ToList()
.ForEach((property) =>
{
var propertyName = string.Empty;
var bodyExpression = property.Body;
if (bodyExpression.NodeType == ExpressionType.Convert
&& bodyExpression is UnaryExpression)
{
Expression operand = ((UnaryExpression)property.Body).Operand;
propertyName = ((MemberExpression)operand).Member.Name;
}
else
{
propertyName = System.Web.Mvc.ExpressionHelper.GetExpressionText(property);
}
entityEntry.Property(propertyName).IsModified = true;
});
dataContext.Configuration.ValidateOnSaveEnabled = false;
return dataContext.SaveChanges();
}
Использование:
this.Update<Contact>(context, context.Entry(modifiedContact), c => c.Active, c => c.ContactTypeId);
@ Doku-so предоставил классный подход с использованием дженериков, я использовал эту концепцию для решения своей проблемы, но вы просто не можете использовать решение @ Doku-so как естьи в этом, и в связанном посте никто не ответил на вопросы об ошибках использования.