2016-08-09 2 views
2

У меня есть этот метод в моем репозитории, который предоставляет EF6 DbContext.Общий метод репозитория EF6 не генерирует правильный SQL

public IList<T> GetEntities<T>(Func<T, bool> predicate) where T : class 
{ 
    return db.Set<T>().Where(predicate).ToList<T>(); 
} 

Когда я наблюдаю, как этот метод выполняется в SQL Profiler, предикат выполняется в памяти. Оператор SQL не содержит условия where.

Любые идеи?

ответ

2

Ваш предикат должен быть Expression, чтобы Entity Framework мог фактически использовать его для генерации SQL вместо его выполнения. Если вы передаете в Func вы на самом деле вызов метода Enumerable.Where вместо Queryable.Where:

public IList<T> GetEntities<T>(Expression<Func<T, bool>> predicate) where T : class 
{ 
    return db.Set<T>().Where(predicate).ToList<T>(); 
} 
+0

Спасибо! Прекрасно работает. –

3

.Where принимает одну из двух вещей: Func<T, bool> или Expression<Func<T, bool>>. Если вы перейдете в Expression<Func<T, bool>>, ваш EF-запрос должен работать правильно.

public IList<T> GetEntities<T>(Expression<Func<T, bool>> predicate) where T : class 

Вы назвали бы его точно так же:

GetEntities(x => x.Id == 34) 

Когда вы передаете в Func<T, bool>, то IEnumerable<T> реализация выполняется, который использует Linq к объектам, а не-к-Entities Linq.

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