Entity Framework - База данных Func вызывается весь запрос таблицы
Будьте осторожны при использовании Entity Framework большинство производительности убийцы - неверный код запроса приводит к базе данных полных запросов таблицы.
Когда мы встретились, пример кода, видим следующее:
//错误的代码
Func <QuestionFeed, BOOL> предикат = NULL;
если (тип == 1)
{
предикат = F => f.FeedID == Идентификатор && f.IsActive == TRUE;
}
Иначе
{
предикат = F => f.FeedID == ID;
}
//_QuestionFeedRepository.Entities的类型为IQueryable <QuestionFeed>
_questionFeedRepository.Entities.Where (предикат);
Выше код логики LINQ запрос генерируется динамически в зависимости от условий, типа Func, где переменная в качестве параметра метода.
Если тип параметра на самом деле требуется: Expression <Func <TSource, BOOL >>.
Обратите внимание, что эта проблема не писать код, запустить результаты являются правильными. После выхода монитора SQL Server Profiler нашел QuestionFeed соответствующей таблицы базы данных был полный запрос таблицы, прежде чем мы знаем проблему этого места.
Вопрос заключается в том:
Когда переменная типа Func LINQ, где метод в качестве параметра запроса, Enitity Структура запроса будет производить полную таблицу, данные всей таблицы базы данных загружается в память, то дальнейшие запросы на основе, где условия в памяти.
Решение:
不要 用 Func <TSource, BOOL> 用 Expression <Func <TSource, BOOL >>.
//正确的代码
Expression <Func <QuestionFeed, BOOL >> предикат = NULL;
если (тип == 1)
{
предикат = F => f.FeedID == Идентификатор && f.IsActive == TRUE;
}
Иначе
{
предикат = F => f.FeedID == ID;
}
_QuestionFeedRepository.Entities.Where (предикат);
Будьте осторожны при использовании Entity Framework большинство производительности убийцы - неверный код запроса приводит к базе данных полных запросов таблицы.
Когда мы встретились, пример кода, видим следующее:
//错误的代码
Func <QuestionFeed, BOOL> предикат = NULL;
если (тип == 1)
{
предикат = F => f.FeedID == Идентификатор && f.IsActive == TRUE;
}
Иначе
{
предикат = F => f.FeedID == ID;
}
//_QuestionFeedRepository.Entities的类型为IQueryable <QuestionFeed>
_questionFeedRepository.Entities.Where (предикат);
Выше код логики LINQ запрос генерируется динамически в зависимости от условий, типа Func, где переменная в качестве параметра метода.
Если тип параметра на самом деле требуется: Expression <Func <TSource, BOOL >>.
Обратите внимание, что эта проблема не писать код, запустить результаты являются правильными. После выхода монитора SQL Server Profiler нашел QuestionFeed соответствующей таблицы базы данных был полный запрос таблицы, прежде чем мы знаем проблему этого места.
Вопрос заключается в том:
Когда переменная типа Func LINQ, где метод в качестве параметра запроса, Enitity Структура запроса будет производить полную таблицу, данные всей таблицы базы данных загружается в память, то дальнейшие запросы на основе, где условия в памяти.
Решение:
不要 用 Func <TSource, BOOL> 用 Expression <Func <TSource, BOOL >>.
//正确的代码
Expression <Func <QuestionFeed, BOOL >> предикат = NULL;
если (тип == 1)
{
предикат = F => f.FeedID == Идентификатор && f.IsActive == TRUE;
}
Иначе
{
предикат = F => f.FeedID == ID;
}
_QuestionFeedRepository.Entities.Where (предикат);