Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151

Где выполняется запрос LINQ: в БД или памяти?

13.02.2014, 13:31. Показов 1517. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Хочу прояснить для себя следующий момент, помогите, пожалуйста. Работаю с EF и Code First. Для доступа к БД создал общий репозиторий:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
        private EFDbContext context;
        private DbSet<TEntity> dbSet;
 
        public GenericRepository(EFDbContext context)
        {
            this.context = context;
            this.dbSet = context.Set<TEntity>();
        }
 
        public IQueryable<TEntity> GetAll()
        {
            return dbSet.AsQueryable();
        }
 
}
с методом IQueryable<TEntity> GetAll(), возвращающим все объекты определенной сущности. Далее, в купе с паттерном UoW, этот метод используется следующим образом в контроллере(MVC):

C#
1
IQueryable<Product> products = unitOfWork.ProductRepository.GetAll().Where(p => p.Category.UrlName == currentSortValue);
У меня вопрос, как выполняется указанный выше запрос для заполнения IQueryable<Product> products? Из БД выбираются в память все товары и уже в памяти происходит фильтрация по критерию Where(p => p.Category.UrlName == currentSortValue) или выборка соответствующих критерию отбора товаров происходит в БД.

Т.е., нужно ли писать в репозитории метод наподобие:

C#
1
IQueryable <TEntity> CetBySearchCriteria(searchCriteria);
или можно действовать только с пом. GetAll()?

Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2014, 13:31
Ответы с готовыми решениями:

Когда выполняется запрос linq
int msv = { 1, 2, 3 }; var res = msv.Select(n =&gt; n * n).ToArray(); foreach (int i in res) Console.WriteLine(i); // 1, 4, 9 msv = 10; ...

Где можно почитать о рисовании карт памяти, LINQ и рекурсивных вызовах?
Добрый день. Где можно почитать о рисовании карт памяти, LINQ и рекурсивных вызовах?

Где проверить сколько выполняется запрос(скрипт)
Друзья, подскажите , где я могу отследить в lazarus сколько по времени выполняется скрипт(или запрос). То есть есть проблемный участок...

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.02.2014, 13:57
В вашем случае фильтрация по Where транслируется парсером в соответствующий SQL-запрос и запрос уже выполняется на стороне базы.
А вот если вы возвращать из метода будете dbSet.AsEnumerable, то фильтрация уже будет проходить в памяти средствами .NET.

На всякий случай: лучше не "выносить" доступ к базе за пределы контроллера, так как неизвестно когда запрашивающий будет собственно проводить обход данных, а это может случиться уже после того, как соединение с базой разорвано.
Если метод называется GetAll, то делайте в нем запрос в базу, переносите полученные значения в коллекцию в памяти, и ее уже возвращайте.
Если вам нужно проводить какую-то фильтрацию на стороне базы, то передавайте в метод Expression. Хотя, в этом случае метод уже должен называться не GetAll
1
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
13.02.2014, 14:19  [ТС]
kolorotur, огромное спасибо за помощь! Я так себе это и представлял, поэтому и выбирал изначально IQueryable, но несколько противоречивая информация в Гугле смутила. Методы с Expression и для единичной выборки по ID сделаю.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.02.2014, 14:37
Цитата Сообщение от ldkldk Посмотреть сообщение
Методы с Expression и для единичной выборки по ID сделаю.
Чтобы долго не искать и если кому-то вдруг потребуется:
C#
1
2
3
4
public TEntity[] Find(Expression<Predicate<TEntity>> filter)
{
   return dbSet.Where(filter).ToArray();
}
Вызов:
C#
1
var products = unitOfWork.ProductRepository.Find(p => p.Category.UrlName == currentSortValue);
1
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
13.02.2014, 15:17  [ТС]
Небольшая поправка:

C#
1
2
3
4
public TEntity[] Find(Expression<Func<TEntity,bool>> filter)
{
   return dbSet.Where(filter).ToArray();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2014, 15:17
Помогаю со студенческими работами здесь

Linq to Xml запрос, где обьект имеет List обьектов другого класса
есть классы public class Worker { public List&lt;EducationDuringWorking&gt; EducationsDuringWorking { get; set; } //... } ...

Linq или не Linq. Linq медленней стандартных методов?
Есть у нас два массива, нужно найти совпадения в первом из второго. Два варианта реализации, первый костылем, второй с linq, но скорость...

Где выполняется функция на сервере или клиенте?
как определить где выполняется функция на сервере или клиенте?

Как составить LINQ запрос чтобы получить все индексы где лежит линия минимум из трех троек?
Есть квадратный массив, например такой : 3 3 3 2 1, 2 4 3 3 3 3 3 4 3 1 2 3 5 3 1 как составить запрос чтоб в ответе...

Проверка где выполняется сценарий: в хосте или ISE
Подскажите, как в сценарии сделать проверку, в какой среде выполняется в данный момент этот же сценарий: хост PowerShell или ISE? Если это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru