Позаботьтесь о производительности:
Я испытал, что, по крайней мере, с EF Core разные ответы, приведенные здесь, могут привести к разной производительности. Мне известно, что OP спрашивал о Linq to SQL, но мне кажется, что те же вопросы возникают и с EF Core.
В конкретном случае, с которым мне пришлось справиться, (синтаксически более приятное) предложение Марка Гравелла привело к левым соединениям внутри перекрестного применения - аналогично тому, что описал Майк У. - в результате чего предполагаемые затраты на этот конкретный запрос составили два в разы выше по сравнению с запросом без перекрестных соединений . Время выполнения сервера отличалось в 3 раза . [1]
Решение Марка Гравелла привело к запросу без перекрестных соединений.
Контекст: мне, по сути, нужно было выполнить два левых соединения для двух таблиц, каждая из которых снова требовала соединения с другой таблицей. Кроме того, там мне пришлось указать другие условия для таблиц, к которым мне нужно было применить левое соединение. Вдобавок у меня было два внутренних соединения на главной таблице.
Ориентировочные расходы оператора:
- с крестом применить: 0,2534
- без креста применить: 0,0991.
Время выполнения сервером в мс (запросы выполнялись 10 раз; измерено с помощью SET STATISTICS TIME ON):
- с крестовым нанесением: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- без крестовины: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(Самый первый запуск был медленнее для обоих запросов; кажется, что что-то кешируется.)
Размеры стола:
- основная таблица: 87 строк,
- первая таблица для левого соединения: 179 строк;
- вторая таблица для левого соединения: 7 строк.
Версия EF Core: 2.2.1.
Версия SQL Server: MS SQL Server 2017-14 ... (в Windows 10).
Все соответствующие таблицы имели индексы только по первичным ключам.
Мой вывод: всегда рекомендуется смотреть на сгенерированный SQL, поскольку он действительно может отличаться.
[1] Интересно, что при включении «Клиентской статистики» в MS SQL Server Management Studio я мог увидеть противоположную тенденцию; а именно, последний запуск решения без перекрестного применения занял более 1 секунды. Полагаю, что здесь что-то пошло не так - может быть, с моей настройкой.