Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

IQueryable в Entity Framework

#c_sharp #entity_framework #linq


Я так поняла, что если у меня данные IQueryable, то запрос выполняется, только когда
я вызываю методы Count(), ToList() и подобные, либо начинаю перебирать в цикле.

//не загружает данные
IQueryable employeesModels = _dbDopuskContext.Employees.AsNoTracking().Where(e
=> e.Deleted.Equals(0));

//не загружает данные    
foreach (string s in searchValues)
{
employeesModels = employeesModels.Where(e => e.Surname.Contains(s) || e.Name.Contains(s)
|| e.Patronymic.Contains(s) || e.Tabnum.Contains(s));
}                    

//загружает, т.к. используется Take
employeesModels = employeesModels.Skip((currentPage - 1) * Defined.EmployeesPageLength)
.Take(Defined.EmployeesPageLength);


В первый раз так и отрабатывает. Во второй после первого же простого запроса лист
заполняется. Может бд хэш какой сохраняет? Она у меня все время подключена, как синглтон
сделана. 

Мне совершенно не подходит такой способ, надо запрос накопить и потом выполнить,
у меня получается данные на клиенте сортируются.

Как сделать, чтобы данные заполнялись только когда я к ним обращаюсь?
    


Ответы

Ответ 1



То, что вы видите в ResultsView в дебаге - это результат работы отладчика, который сам выполняет перечисление результатов. Фактически, запрос к базе выполняется каждый раз когда вы заглядываете в ResultsView - и к работе программы без отладчика это не имеет ни малейшего отношения. Чтобы определить какие запросы к БД реально выполняются - нужно использовать профайлер. Например, можно использовать встроенный в студию IntelliTrace. Альтернативный вариант - использовать утилиты идущие в составе с СУБД, например SQL Server Profiler Также можно использовать встроенные возможности Entity Framewwork в виде свойства DbContext.Database.Log - этот делегат будет вызываться каждый раз когда выполняется запрос к БД.

Комментариев нет:

Отправить комментарий