Я использую структуру сущностей вместе с шаблоном репозитория для взаимодействия с базой данных.
Для простоты я делаю что-то вроде этого.
public T Update(T entity)
{
// Update Entity
}
То, что я хочу сделать вместо изменения объекта вне функции, я хочу иметь возможность передать выражение для обновления объекта.
public T Update(T entity, ItemINeedPassedIn, Expression<Func<TDBTable, bool>> predicate)
{
var dbEntity = await GetOneAsync(predicate); // Which fetches me the entity to change
// Code to attach the property value to entity goes here <-- This is what I need
// Update Entity
}
Например
Update(Customer, x => x.FirstName = "John", x => x.Id == 4);
Клиент будет нулевым, что требует поиска. Эта часть работает.
Мне нужно обновить имя клиента на john, где Id == 4. Я хочу передать выражение и прикрепить его к dbEntity для обновления.
x => x.FirstName = "John"
должно как-то стать
dbEntity.FirstName = "John"
Как мне это сделать?
ItemINeedToPassIn - это то, что я ищу и обновляю Id == 4
Я думаю, вопрос в том, какие бывают типы ItemINeedPassedIn и dbEntity? Или вы не знали их до звонка Update? Знаете ли вы тип x в вашем сказуемом? Я думаю, что самым простым способом ответить на ваш вопрос было бы, чтобы вы предоставили нам входные данные и желаемый результат, уточнив, известны ли типы или нет.
Вам действительно нужен Expression<Func<TDBTable, bool>> или просто Func<TDBTable, bool>?





Хорошо, вот что я в итоге сделал. Я нашел эта функция, который, похоже, помогает.
public static void SetEntityValue(TDBTable entity, Expression<Func<TDBTable, object>> expression, object value)
{
ParameterExpression valueParameterExpression = Expression.Parameter(typeof(object));
Expression targetExpression = expression.Body is UnaryExpression ? ((UnaryExpression)expression.Body).Operand : expression.Body;
var newValue = Expression.Parameter(expression.Body.Type);
var assign = Expression.Lambda<Action<TDBTable, object>>
(
Expression.Assign(targetExpression, Expression.Convert(valueParameterExpression, targetExpression.Type)),
expression.Parameters.Single(),
valueParameterExpression
);
assign.Compile().Invoke(entity, value);
}
Я вызываю это в моей функции обновления
public T Update(TDBTable entity, Expression<Func<TDBTable, object>> expression, object value,
Expression<Func<TDBTable, bool>> predicate)
{
var dbEntity = await GetOneAsync(predicate); // Which fetches me the entity to change
// Sets the variable
SetEntityValue(result, expression, value);
// Update Entity
result = await EditAsync(result);
return entity;
}
Я называю это так
Update(new Customer(), x => x.FirstName, "John", x => x.Id == 4);
Что такое
ItemINeedPassedIn? А почему вы присваиваете Id 4? Должно бытьx.Id == 4?