Построение linq-запроса - PullRequest
1 голос
/ 31 мая 2011

У меня есть вопрос (q) со многими ответами, каждый ответ имеет различные тексты, различающиеся по языку. Я хочу написать запрос, чтобы вернуть все ответы на заданном языке (Lang), но мне сложно разобраться ... вот что я пытаюсь:

List<string> Answers = q.Answers
   .Select(x => x.Texts.Where(l => l.Language.ISO == Lang).Select(t => t.Value))
   .ToList();

, который генерирует:

Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.IEnumerable<string>>' to 'System.Collections.Generic.List<string>'

возможно, у меня не может быть выбора внутри выбора ... и:

List<string> Answers = q.Answers
   .Select(x => x.Texts.Where(l => l.Language.ISO == Lang))
   .Select(t => t.Value)
   .ToList();

где я бы подумал, что первый выбор возвращает текст, что означает, что второй выбор может найти его. Значение ... но, нет:

'System.Collections.Generic.IEnumerable<Website.Models.Text>' does not contain a definition for 'Value' and no extension method 'Value' accepting a first argument of type 'System.Collections.Generic.IEnumerable<Website.Models.Text>' could be found (are you missing a using directive or an assembly reference?)

... возможно, я близко, но не могу понять. как это сделать?

- Правка -

кредит здесь идет к SLaks. Вот последнее утверждение:

List<string> Answers = q.Answers
        .SelectMany(x => x.Texts)
        .Where(x => x.Language.ISO == Lang)
        .Select(x => x.Value)
        .ToList();

Ответы [ 2 ]

3 голосов
/ 31 мая 2011

Вам необходимо использовать SelectMany или (в синтаксисе LINQ) выражение from ... from ... select:

var query = from answer in q.Answers
            from text in answer.Texts
            where text.Language.ISO == lang
            select text.Value;

var result = query.ToList();

Запрос выбирает значение всех текстов во всех ответах на вопрос q, гдеязык текста lang.

2 голосов
/ 31 мая 2011

Вам необходимо вызвать .SelectMany(), чтобы свести список наборов Text s (IEnumerable<IEnumerable<string>>) в один набор Text s (IEnumerable<string>).

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