Метод и память объекта ObjectSet Where()
Я использую методы ObjectSet для выполнения различных запросов в таблице, а именно, выбирая из нее несколько записей:
var results = Repository.Find(c => c.Enabled == 1).ToList();
Вот метод Find моего хранилища:
public IEnumerable<T> Find(Func<T, bool> predicate)
{
try
{
return _objectSet.Where<T>(predicate);
}
catch
{
throw;
}
}
Теперь, если в целевой таблице около 1 000 000 записей, я вижу, что использование памяти процессом значительно возрастает, даже если выполняемый мной вызов Find должен возвращать максимум несколько записей.
Кажется, что все записи обрабатываются на стороне клиента, а затем фильтруются. Это явно не то, что я хочу, чтобы LINQ делал.
Вы видите что-то явно не так с тем, что я делаю?
Заранее спасибо.
1 ответ
Я думаю, что вы должны использовать Expression<Func<T, bool>>
вместо равнины Func<T, bool>
:
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate) {
// your code
}
Where
перегружен (см. класс ObjectSet), и Func<T>
перегрузка определяется IEnumerable<T>
, в то время как Expression<TDelegate>
используется IQueryable<T>
, Так как predicate
это Func<T>
компилятор вызывает метод расширения, определенный для IEnumerable<T>
, который в свою очередь выбирает все записи и делает LINQ для объектов.