2011-05-31 74 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