Когда предпочитать объединения, выраженные с помощью SelectMany (), вместо объединений, выраженных с помощью ключевого слова join в Linq - PullRequest
8 голосов
/ 26 октября 2010

Linq позволяет выражать внутренние объединения с помощью ключевого слова join или с помощью SelectMany () (то есть пары ключевых слов) с ключевым словом where:

var personsToState = from person in persons
                     join state in statesOfUS
                     on person.State equals state.USPS
                     select new { person, State = state.Name };
foreach (var item in personsToState)
{
    System.Diagnostics.Debug.WriteLine(item);
}

// The same query can be expressed with the query operator SelectMany(), which is
// expressed as two from clauses and a single where clause connecting the sequences.                     
var personsToState2 = from person in persons
                      from state in statesOfUS
                      where person.State == state.USPS
                      select new { person, State = state.Name };
foreach (var item in personsToState2)
{
    System.Diagnostics.Debug.WriteLine(item);
}

Мой вопрос: когда это целесообразноиспользовать стиль соединения, и когда использовать стиль where, имеет ли один стиль преимущества перед другим стилем?

Ответы [ 2 ]

6 голосов
/ 26 октября 2010

Для локальных запросов 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 предлагает вам, в зависимости от того, как вам нужно соединить ваши данные.

2 голосов
/ 26 октября 2010

Объединение более эффективно: для поиска подходящих значений используется класс Lookup (разновидность словаря с несколькими значениями для одного ключа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...