Почему мой результат типа List <IEnumerable <T>> - PullRequest
1 голос
/ 08 августа 2011

Два запроса, которые должны привести к списку номеров счетов (строк).Однако второй запрос фактически возвращает List<IEnumerable<string>>, где я хотел бы, чтобы он возвращал List<string>.Что я делаю не так?

//the type here resolves to List<string>
var acts = (from a in base.context.Accounts
            select a.AccountNumber).ToList();

//the type here resolves to List<IEnumerable<string>>
var uAccounts = (from u in base.context.Users
                 select u.Accounts.Select(s => s.AccountNumber)).ToList();

Ответы [ 9 ]

3 голосов
/ 08 августа 2011

Изменение

var uAccounts = (from u in base.context.Users
             select u.Accounts.Select(s => s.AccountNumber)).ToList();

до

var uAccounts = base.context.Users.SelectMany(u => 
                u.Accounts.Select(s => s.AccountNumber)).ToList();

И чтобы фактически ответить на ваш вопрос, разница между двумя строками вашего кода заключается в том, что первая проходит через каждую учетную запись и выбирает только номер учетной записи. Второе утверждение выбирает встроенный запрос Linq IEnumerable<string>. Таким образом, вы конвертируете в List<T> из этих IEnumerable<string>

Это фактически показывает преимущество метода расширения SelectMany (на самом деле я не уверен, как использовать это в операторе запроса). Вместо этого метод SelectMany выравнивает IEnumerable<T>, который вы обычно получаете, к одному перечислению элемента T. Поэтому, когда вызывается ToList(), он вернет вам List<string> вместо перечисляемого.

3 голосов
/ 08 августа 2011

Ваше предложение select возвращает / вкладывает другую операцию select, и, следовательно, вы получаете вложенные перечисления.Чтобы сгладить список, вам нужно использовать SelectMany.

var acts = base.context.Accousts
  .SelectMany(a => x.AccountNumber)
  .ToList();
2 голосов
/ 08 августа 2011

Несмотря на то, что вы можете использовать SelectMany, проще вкладывать предложения from:

var uAccounts = (from u in base.context.Users
                  from a in u.Accounts
                    select a.AccountNumber).ToList();

Когда и если вы используете такие продукты, как NHibernate, вы захотите узнать эту идиому, как она естьочень простой способ объединения таблиц в результирующем коде SQL.

2 голосов
/ 08 августа 2011

u.Accounts.Select(s => s.AccountNumber) само по себе дает вам IEnumerable<string>.

Затем заверните это в from u in base.context.Users select u.Accounts.Select(s => s.AccountNumber) и получите IEnumerable<IEnumerable<string>>.

Затем вызывается .ToList(), что дает List<IEnumerable<string>>.

1 голос
/ 08 августа 2011

u.Accounts.Select(s => s.AccountNumber)

это список номера счета

так

(from u in base.context.Users
     select u.Accounts.Select(s => s.AccountNumber))

- это IE из множества номеров счетов

добавление .ToList ()

Составляет список списков номеров счетов

1 голос
/ 08 августа 2011

Я думаю, мне нужно использовать u.Accounts.SelectMany(...), чтобы получить желаемый результат.

1 голос
/ 08 августа 2011

Во втором запросе вы делаете второй выбор, который создает ваш внутренний список

Это возвращает IEnumerable<string>

 u.Accounts.Select(s => s.AccountNumber)

, а затем вы оборачиваете его в другой выбор, которыйсоздает внешний список

0 голосов
/ 08 августа 2011

u.Accounts.Select(s => s.AccountNumber) возвращает IEnumerable<string>

select u.Accounts.Select(s => s.AccountNumber) возврат IEnumerable<IEnumerable<string>>

select u.Accounts.Select(s => s.AccountNumber)).ToList(); просто превращает внешний IEnumerable в IList

0 голосов
/ 08 августа 2011

Во втором случае ToList() применяется только к внешнему списку, который сам состоит из списков.

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