Entity Framework - База данных Func вызвала полные запросы таблицы тянуть мать выражение Entity Framework - База данных Func вызывается весь запрос таблицы

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 (предикат);
Скопировать код

рекомендация

отwww.cnblogs.com/wfy680/p/12380793.html
рекомендация