Метод цепочки эквивалент? - PullRequest
2 голосов
/ 07 ноября 2010


Это работает правильно (из первоначального тестирования).
Поскольку цепочка методов является моим предпочтительным форматом, я попытался выяснить, что такое эквивалент цепочки методов, но безуспешно. Есть идеи?

var data = (from p in db.Persons
            from c in db.Companies
            where c.CompanyName == companyName && p.CompanyId == c.CompanyId
            select p)
            .Select(p => new
            {
                Id = p.PersonId,
                Name = string.Format("{0} {1}", p.FirstName, p.LastName)
            });

Спасибо
* 1007 Ред *

Ответы [ 3 ]

5 голосов
/ 07 ноября 2010

Я бы немного переупорядочил запрос, чтобы сначала отфильтровать companyName, а затем выполнить объединение. Это позволит вам использовать этот свободный синтаксис:

var query = db.Companies.Where(c => c.CompanyName == companyName)
              .Join(db.Persons, c => c.CompanyId, p => p.CompanyId, (p, c) => p)
              .Select(p => new
              {
                  Id = p.PersonId,
                  Name = string.Format("{0} {1}", p.FirstName, p.LastName)
              });

Сказав это, некоторые запросы гораздо проще писать в синтаксисе запросов, так зачем себя ограничивать? Сложные объединения обычно лучше в синтаксисе запроса, и вы также получаете преимущество использования SelectMany формата объединения с from ... from... вместо join p in ... on x equals y. См. Этот вопрос для получения более подробной информации: Когда предпочитать объединения, выраженные с помощью SelectMany (), вместо объединений, выраженных с помощью ключевого слова join в Linq .

4 голосов
/ 07 ноября 2010

Без изменения запроса, что-то вроде ниже, где oi - непрозрачный идентификатор:

var data =  db.Persons.SelectMany(p =>  db.Companies, (p, c) => new {p,c})
    .Where(oi => oi.c.CompanyName == companyName
        && oi.p.CompanyId == oi.c.CompanyId)
    .Select(oi => oi.p)
    .Select(p => new
    {
        Id = p.PersonId,
        Name = string.Format("{0} {1}", p.FirstName, p.LastName)
    });

Однако вы также можете рассмотреть несколько перезаписей;возможно присоединение или перемещение проверки названия компании ранее;и удаление двойного выбора.

2 голосов
/ 07 ноября 2010

Не-верхнего уровня из предложения переводятся в SelectMany звонки:

db.Persons.SelectMany(p => db.Companies.Select(c => new { p, c }))

Это не интуитивно понятно и немного хакерски (хотя логично и надежно). Лично я склонен использовать синтаксис запросов для сложных запросов, подобных этому, потому что форма SelectMany не читается.

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