Для локальных запросов Join
более эффективен благодаря ключевому поиску, так как Athari упомянул , однако для LINQ to SQL (L2S) вы получите больше пробега из SelectMany
.В L2S SelectMany
в конечном итоге использует какой-то тип SQL-соединения в сгенерированном SQL в зависимости от вашего запроса.
Посмотрите на вопросы 11 и 12 LINQ Quiz Джозефа / БенаАлбахари, авторы C # 4.0 В двух словах.Они показывают образцы различных типов объединений и заявляют:
Благодаря LINQ to SQL объединения на основе SelectMany являются наиболее гибкими и могут выполнять как равные, так и неравные объединения.Добавьте DefaultIfEmpty, и вы также можете выполнять левые внешние объединения!
Кроме того, у Мэтта Уоррена есть подробное сообщение в блоге на эту тему, поскольку оно относится к IQueryable
/ SQL здесь: LINQ: Создание провайдера IQueryable - Часть VII .
Возвращаясь к своему вопросу о том, какой из них использовать, вы должны использовать любой запрос, который будет более читабельным и позволит вам легко выразить себя и четко сформулировать конечную цель.Производительность не должна быть первоочередной задачей, если вы не имеете дело с большими коллекциями и профилировали оба подхода.В L2S вы должны учитывать гибкость, которую SelectMany
предлагает вам, в зависимости от того, как вам нужно соединить ваши данные.