2015-10-08 1 views
2

Я знаю, что выполнение запроса с IEnumerable отложено до тех пор, пока не будут прочитаны элементы в IEnumerable.SQL Profiler показывает запрос до чтения списка IEnumerable

Когда я приостанавливаю следующий код в строке второй, я вижу, что запрос выполняется в базе данных через SQL Profiler. Я думал, что запрос должен быть выполнен в базе данных, когда третья линия выполнена:

1 IEnumerable<Item> items = dbContext.Items; 
2 var a = 0; 
3 gridview.DataSource= items.ToList(); 
4 gridview.DataBind(); 

Может кто-нибудь объяснить, почему он ведет себя, как это?

ответ

3

Выполнение запроса DbSet до IEnumerable не выполняется. Таким образом, либо dbContext.Items метод переопределен для выполняет запрос и не простое свойство, как:

public virtual DbSet<Item> Items { get; set; } 

Или, продемонстрированный код не реальный кода у вас возникли проблемы с, и вы запуск приложения в конфигурации Release, что позволяет оптимизировать работу. Если переменная a никогда не используется, она будет оптимизирована, и вы действительно нарушите следующее утверждение. Это, в свою очередь, может выполнять запрос (если, например, это оператор foreach).

В этом случае переключитесь на конфигурацию Debug и убедитесь, что флажок «Оптимизировать код» не установлен на вкладке сборки свойств проекта.

1

Поиск

dbContext.Configuration.LazyLoadingEnabled = false; 

это может быть причиной.

+0

Можете ли вы попытаться объяснить, почему это вызывает проблему! – eliasah

1

Как упоминал Роман, присвоение IEnumerable не вызывает запрос.

Это ваш отладчик, который оценивает IEnumerable в окне Debug либо в Local, либо Watch, что вызывает увольнение запроса. В большинстве случаев окно Debug запрашивает явно показывать перечисления, но, кажется, где-то вы читаете свой IEnumerable.

Проверьте, есть ли у вас другой код, который может использовать ToList.