Метод и память объекта 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 для объектов.

Другие вопросы по тегам