2017-01-31 3 views
2

Участок:Фильтрация необщего DbSet с динамически построен Expression

У меня есть класс, выполненный в виде фасада вокруг Entity Framework DB контекста. Он разработан для поддержки обратной совместимости, он имитирует класс с тем же открытым интерфейсом, но использует DTO вместо объектов EF.

Проблема:

У меня есть следующий метод внутри класса, описанного выше. Смотрите ниже код:

public IQueryable<T> FindBy<T>(Expression<Func<T, Boolean>> predicate) where T : BaseDto { 

//GetDestinationType takes source type of some declared mapping and returns destination type 
var entityType = Mapping.Mapper.GetDestinationType(typeof (T)); 

var lambda = Expression.Lambda(predicate.Body, Expression.Parameter(entityType)); 

// dbContext declared as class field and initialized in constructor 
var query = dbContext.Set(entityType).Where(lambda); // <-- Cannot use non-generic expression/lambda 

return query.ProjectTo<T>(mapper.ConfigurationProvider); } 
  1. Мне нужно принять выражение, используя DTOs, как в параметре и возврат IQueryable где T: BaseDto в результате
  2. Мне нужно преобразовать входной предикат в тот же предикат с помощью EF сущностей, как в параметре
  3. Мне нужно фильтровать необщего EF DbSet с помощью динамически созданного выражения (предиката)

Главный вопрос

Можно ли фильтровать необщий EF DBSet с помощью динамически созданное выражение (предикат)

Пожалуйста, дайте мне немного клея или дальнейшие указания, если мне нужно использовать какой-то другой подход.

ответ

0

Проблема была решена. Решение было совершенно очевидно. Вместо того, чтобы

var query = dbContext.Set(entityType).Where(lambda); 

можно написать

var query = dbContext 
       .Set(entityType) 
       .ProjectTo<T>(mapper.ConfigurationProvider) 
       .Where(predicate); 

, где предикат является входным параметром метода FindBy().

Этот код будет успешно скомпилирован и, что более важно, EF построит оптимальный запрос к базе данных, который будет включать предложение Where() в тело запроса, поэтому он не будет принимать полный набор записей со стороны БД ,

+0

Это используется AutoMapper, правильно? –

+0

@ChrisHaines да, правильно –

Смежные вопросы