Базовый репозиторий Entity Framework - PullRequest
0 голосов
/ 01 мая 2010

Я пытаюсь создать базовый репозиторий для использования с Entity Framework 4.0 и у меня возникли некоторые проблемы. В этом коде ниже, почему это невозможно сделать в одной строке?

public IEnumerable<T> GetAll<T>(Expression<Func<T, bool>> filter)
{
    IEnumerable<T> allCustomers = this.GetAll<T>();
    IEnumerable<T> result = allCustomers.Where(filter.Compile());

    return result;
}

Не приведет ли это к двум операторам SQL: одному без предложения where, который извлекает все строки, и одному с предложением where, которое только извлекает строки, соответствующие предикату?

Как это можно сделать с помощью одного оператора SQL? Я не могу заставить его скомпилироваться, если я пытаюсь привести filter.Compile () к Func .

1 Ответ

3 голосов
/ 01 мая 2010

Попробуйте это:

this.GetAll<T>().Where(filter);

Если вы хотите добавить дополнительные условия и выполнить их на стороне базы данных (используя SQL), GetAll () должен вернуть IQueryable. IQueryable версия где занимает Expression, поэтому нет необходимости звонить Compile(). EF примет выражение и переведет его в SQL.

Использование IEnumerable версии Where выполняет запрос и извлекает все строки в таблице перед применением фильтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...