|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
||||||||||||||||
EF Core: CROSS APPLY (или быстрый аналог)15.04.2019, 14:07. Показов 3909. Ответов 11
Метки нет (Все метки)
Подскажите, как переписать этот запрос на LINQ (method-based), чтобы EF-Core построил для него эффективный запрос? Т.е. чтобы не выкачивал все данные на сторону клиента и не выполнял по одному отдельному detail-подзапросу на каждую master-запись.
Если из запроса не очень понятно, то задача следующая - выбрать все master-записи у которых есть detail-записи и последняя из detail-записей (в данном случае по ID) удовлетворяет определённым условиям. Не любая, а именно последняя, т.е. если detail-запись удовлетворяет условиям, но не является последней (в рамках данной master-записи), то она не учитывается. При этом в результирующем наборе нужны как данные из master, так и некоторые поля из последней detail-записи, но не все, лишь малая часть полей, т.е. результат нужно как-то так замапить на кастомный объект, чтобы EF в сгенерированном запросе явно перечислил нужные колонки, а не выбирал все. На данный момент все подобные запросы в проекте выполняются напрямую, но хотелось бы перевести их на LINQ. запрос
структура БД
тестовые данные
0
|
||||||||||||||||
| 15.04.2019, 14:07 | |
|
Ответы с готовыми решениями:
11
Нужен быстрый аналог DataGridView Быстрый и легкий аналог Ext js? Как представить с использованием функции высшего порядка (APPLY или FUNCALL) |
|
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
|
||||||||||||||||
| 16.04.2019, 08:18 | ||||||||||||||||
|
kotelok, хороший вопрос, интересный. И поставлен правильно.
Про EF Core не скажу, ибо не доводилось его нормально потыкать, но EF6 такое может вполне себе элегантно и эффективно. Контекст и модели: Кликните здесь для просмотра всего текста
LINQ-запрос: Кликните здесь для просмотра всего текста
И запрос, который генерирует EF6: Кликните здесь для просмотра всего текста
1
|
||||||||||||||||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
|||||||||||||||||||||
| 16.04.2019, 09:03 [ТС] | |||||||||||||||||||||
|
Видимо, EF-Core требуются либо какие-то дополнительные настройки модели, либо иной синтаксис. Вот эту часть:
0
|
|||||||||||||||||||||
|
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
|
|
| 16.04.2019, 09:18 | |
|
kotelok, EF Core ещё сыроватый и каких-то вещей он может тупо не уметь. Так, что не удивительно, что он такую фигню делает)
Я вам могу посоветовать вытащить нужные корневые записи customer сразу отсеянные по возрасту. Потом вытащить все связанные записи сгруппированные по customer_id, чьи customer_data_id = MAX в группе. И в оперативке уже всё это сджойнить.Элегентным это не назовёшь. Добавлено через 1 минуту Блин, интересный вопрос. Дома EF Core воткну и попробую добиться красивого запроса.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||||||||||
| 16.04.2019, 16:22 | ||||||||||||||||
Сообщение было отмечено kotelok как решение
Решение
Вроде фачит, хоть и запрос не самый лучший генерирует.
Контекст и модель
Спер у товарища Usaga.
Запрос
SQL
Запрос, конечно, кривой делает.
2
|
||||||||||||||||
|
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
|
||
| 16.04.2019, 18:18 | ||
|
Мда... Лучше бы оно эксепшен кинуло, чем такой запрос молча выдавать, под видом того, что работает...
Добавлено через 1 час 22 минуты Ну, похоже, что ребята именно в этом направлении и двигаются:
2
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
||
| 16.04.2019, 18:44 [ТС] | ||
|
Думаю, может и в самом деле перейти на на смешанный вариант - EF для базовых CRUD-операций, а всё остальное по-старинке на чистом SQL. Понадёжнее как-то выглядит, да и, в случае чего, перевести проект на другой ORM будет попроще.
0
|
||
|
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
|
|
| 16.04.2019, 18:53 | |
|
kotelok, лучше посмотрите в сторону Linq2Db. Не такая навороченная ORM как EF, но позволяет более низкоуровневые вещи делать и при этом всё равно оставаться на LINQ-запросах. А на голый SQL переходить надо только в самом крайнем случае, когда вы железно уверены, что иначе никак.
1
|
|
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||||||
| 18.04.2019, 14:27 | ||||||
|
Всем здравствуйте.
kotelok, имхо такой запрос поэффективней будет:
1
|
||||||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
|
| 18.04.2019, 14:31 [ТС] | |
|
amr-now
Да, спасибо. Изначально в приложении он именно через CTE был сделан. На 'APPLY' был переписан в попытках мигрировать на EF (что потребовало добавить в используемые таблицы ещё несколько индексов).
0
|
|
|
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
|
|
| 18.04.2019, 18:34 | |
|
kotelok, смею заметить, что Linq2Db поддерживает CTE.
0
|
|
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 18.04.2019, 19:34 | |
|
Usaga, CTE сейчас, если честно сказать, не актуален.
Современные версии MS SQL Server умеют его джойнить в плане запроса в классическом понимании, уравнивая скорость исполнения.
0
|
|
| 18.04.2019, 19:34 | |
|
Помогаю со студенческими работами здесь
12
Что брать Core i7 4960X 2011 или Core i7 4770 1150 ? Intel Core i3-380M или AMD Athlon 2 Dual-Core P360
Core 2 Quad 9xxx или Core i5 2xxx для уровня GTX 650 Какой процессор лучше Pentium dual core 5200 или Core 2 duo e 8200 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
/ / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров)
. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|