Многочисленные оценки объекта IQueryable попадают в базу данных несколько раз? - PullRequest
7 голосов
/ 09 июня 2011

В Entity Framework, если я сделаю следующее:

var count = myIQueryable.Count();
var list = myIQueryable.ToList();

это дважды попадет в базу данных?или только один раз?

Ответы [ 2 ]

10 голосов
/ 09 июня 2011

Чтобы эффективно подсчитать количество записей, фреймворк должен оценить запрос, таким образом ударив по базе данных.Однако, поскольку запрос мог измениться между Count () и ToList (), он должен выполнить оценку снова.Примите во внимание следующее:

var myIQueryable = my.db<SomeModel>();  // IQueryable<SomeModel>
var countQuery = myIQueryable.Count();  // 10
MakeAdditions(myIQueryable, 10);        // adds 10 items
var list = myIQueryable.ToList();       // List<SomeModel> count=20
MakeAdditions(myIQueryable, 10);
var countList = list.Count();           // still 20, List never changed

Другими словами, все вызовы IQueryable по-прежнему подчиняются тому, как он выполняет свои запросы.После записи запроса в список вы имеете дело исключительно со своим списком в памяти, независимо от изменений, которые происходят с источником данных IQueryable.

7 голосов
/ 09 июня 2011

Да, он дважды попадает в базу данных, поскольку Count и ToList оцениваются с нетерпением.Если вы просто хотите получить к нему доступ один раз, сделайте следующее:

var list = myIQueryable.ToList();
var count = list.Count;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...