Linq to SQL выполняет запрос немедленно - PullRequest
3 голосов
/ 28 декабря 2011

У меня есть запрос Linq и я хочу выполнить его немедленно, а затем манипулировать данными. Теперь в приведенном ниже коде первый (1) запрос Linq выполняется при выполнении второго (2) запроса Linq. Я хотел бы выполнить первый (1) запрос в первую очередь, как это сделать?

// 1
var statistic = DataAccess.Instance.Statistics
                    .Where(p => p.DateStamp >= fromDate && p.DateStamp <= DateTime.UtcNow && p.UserId == userId)
                    .Select(p => new {p.DateStamp.Year, p.DateStamp.Month, p.DateStamp.Day });


values = new int[interval];
labels = new string[interval];

for (var i = 0; i < labels.Length; i++)
{
    // 2
    var recordsCount = statistic.Count(p => p.Year == dayStep.Year && p.Month == dayStep.Month && p.Day == dayStep.Day);
}

Ответы [ 3 ]

8 голосов
/ 28 декабря 2011

Я думаю, что вам не хватает важной концепции манипулирования данными в .NET

Отсроченная и немедленная загрузка

Важно подчеркнуть, что по умолчанию LINQ to SQL извлекает данные из базы данных, только когда вы запрашиваете ее, а не когда вы определяете запрос LINQ to SQL или создаете Коллекция столов. Это называется отложенной загрузкой.

Когда цикл foreach запускается, LINQ to SQL создает и запускает оператор SQL SELECT, полученный из запроса LINQ to SQL для создания объекта ADO.NET DataReader. Каждая итерация Цикл foreach выполняет необходимые методы GetXXX для извлечения данных для этой строки. После последняя строка была извлечена и обработана циклом foreach, LINQ to SQL закрывает подключение к базе данных.

Отсроченная выборка гарантирует, что только те данные, которые фактически использует приложение, извлекаются из база данных. Однако, если вы обращаетесь к базе данных, работающей на удаленном экземпляре SQL Сервер, выбирающий данные строка за строкой, не наилучшим образом использует пропускную способность сети. В этом В этом случае вы можете извлечь и кэшировать все данные в одном сетевом запросе, принудительно оценка запроса LINQ to SQL. Вы можете сделать это, вызвав ToList или ToArray методы расширения, которые извлекают данные в список или массив при определении LINQ to SQL запрос, как это:

var productsQuery = from p in products.ToList()
select p;
3 голосов
/ 28 декабря 2011

Попробуйте это 1-е утверждение (обратите внимание на .ToList() утверждение)

var statistic = DataAccess.Instance.Statistics.Where(p => p.DateStamp >= fromDate && p.DateStamp <= DateTime.UtcNow && p.UserId == userId).
                Select(p => new {p.DateStamp.Year, p.DateStamp.Month, p.DateStamp.Day }).ToList();
1 голос
/ 28 декабря 2011

Вы можете сделать что-то вроде .ToList (), и это должно заставить его выполнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...