EditLookup записей по нескольким клавишам
Для дальнейшего уточнения, в приведенном ниже примере, выражение дерево будет построено с помощью отражения, чтобы определить имя соответствующего свойства. Поскольку у меня есть «Т», определенный как общий класс и уже ограничен определенным интерфейсом, я ищу строго типизированный подход. Это должно быть возможным ИМО.
Желаемый результатпсевдо
public class RepositoryBase<TEntity, TKey> : IRepository<TEntity, TKey>
where TEntity : IEntity<TKey>
{
protected virtual ISpecification<TEntity> ByMultipleKeysSpecification(IEnumerable<TKey> keys)
{
return keys.Select(key =>
Expression.Lambda<Func<TEntity, bool>>(entity => key.Equals(entity.Id)))
.Aggregate<Expression<Func<TEntity, bool>>, ISpecification<TEntity>>(null,
(current, lambda) => current == null ? new ExpressionSpecification<TEntity>(lambda) : current.Or(lambda)
);
}
}
Я ищу способ создать спецификацию, которая находит объекты несколькими ключами. Я уже нашел этот пример в сети:
keys.Select(key =>
Expression.Lambda<Func<T, bool>>(
Expression.Equal(
Expression.PropertyOrField(parameter, propInfo.Name),
Expression.Constant(key)
), parameter
)
)
.Aggregate<Expression<Func<T, bool>>, ISpecification<T>>(null,
(current, lambda) => current == null ? new Specification<T>(lambda) : current.Or(lambda)
);
Этот пример приходит близко к тому, что мне нужно, однако он оценивает имя идентификатора собственности во время выполнения с помощью отражения, так как любой тип может быть использован в качестве T , В моем случае я ограничил возможные типы для пользовательского интерфейса (IEntity), поэтому свойство * id * известно во время компиляции. Как я могу реорганизовать этот пример в соответствии с моими потребностями? Я не думаю, что
необходимо создать выражение во время выполнения
оценить свойство во время выполнения.
Это не совсем понятно, о чем вы просите. Если вам не нужно создавать выражение во время выполнения, что мешает вам просто написать выражение как нормальную лямбду? –
@SteveRuble Извините. Я немного объяснил это. – xvdiff