2011-05-31 88 views
1

我有一個問題(q)與許多答案,每個答案都有各種不同的文字,不同的語言。我想編寫一個查詢在給定的語言(郎)返回所有問題的答案,但我有困難想出來的......這裏就是我想:構建一個linq查詢

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

需要調用.SelectMany()拼合套Text S(IEnumerable<IEnumerable<string>>)名單爲一組的Text S(IEnumerable<string>)。

+0

笑。好。我想這必須有一個特殊的構造。謝謝一堆! – ekkis 2011-05-31 03:04:18

3

您需要使用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值。

+0

哦,這很酷。我很少使用這種語法,但它是如何可以訪問和answer.Texts的漂亮。謝謝。 – ekkis 2011-05-31 03:05:16