Этот запрос выполняется в коллекции в памяти или в базе данных? - PullRequest
3 голосов
/ 15 февраля 2011

Я использую платформу сущностей на веб-сайте форума и у меня есть два примера запросов с вопросами.

Запрос # 1) Этот запрос должен получить количество всех тем на форуме.Это выполнение счетчика в SQL, чтобы я получил только номер обратно?Или он вытягивает все темы в память, а затем подсчитывает их в коллекции?

            return DBContext.Topics
                .Where(x => !x.ModsOnly)
                .Where(x => !x.Board.ModsOnly)
                .Where(x => !x.Board.Hidden)
                .Count();

Запрос № 2) В этом запросе предполагается получить все темы, упорядочить их по дате последнего ответа (или дате темы).если нет ответов).Затем он считает результаты и разбивает их на страницы.Сколько из этого запроса выполняется в базе данных?Этот запрос выполняется НАВСЕГДА, поэтому я думаю, что он в какой-то момент вытягивает все темы в память, вероятно, до того, как подкачка вступит в силу.

            var query = DBContext.Topics
                    .Where(x => !x.ModsOnly)
                    .Where(x => !x.Board.ModsOnly)
                    .Where(x => !x.Board.Hidden)
                    .OrderByDescending(x => x.GlobalSticky)
                    .ThenByDescending(x => x.Replies
                        .Where(r => !r.ModsOnly)
                        .Any() ? x.Replies
                            .Where(r => !r.ModsOnly)
                            .Max(r => r.PostedDate) : x.PostedDate);
                int totalTopics = query.Count();
                if (totalTopics > itemsPerPage)
                    return query.Skip((page - 1) * itemsPerPage).Take(itemsPerPage);
                else
                    return query;

Я не гуру LINQ, поэтому любая помощь приветствуется.Это сложный запрос, я знаю, но если кто-то может занять секунду, чтобы проанализировать его и выяснить, где / если я где-то ошибся, это было бы очень полезно.

Примечание: я пытаюсь избежать создания столбцав темах под названием «LastReplyDate» и упорядочение тем по этому.Для моих целей мне бы очень хотелось, чтобы порядок выполнялся по последнему ответу, а не по произвольной колонке по теме, которую я мог бы обновлять при каждом добавлении / удалении ответа.Однако, если вы, ребята, думаете, что нет другого способа достичь моей цели, я рассмотрю этот путь.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2011

Ваш первый пример будет использовать один запрос к БД.Да, он считает в SQL.

Ваш второй будет использовать два.Один для int totalTopics = query.Count(); и один для постраничных результатов.

Ни один из них не будет делать ограничения и т.д. в памяти.

1 голос
/ 15 февраля 2011

Запросы будут выполняться в базе данных, но для второго я бы порекомендовал оформить заказ по пунктам, поскольку они не нужны для операции подсчета и замедляют ее.

...