我有一个问题(q)有很多答案,每个答案都有各种文本,语言不同。我想写一个查询来返回给定语言中的所有答案(郎),但我很难搞清楚......这就是我正在尝试的事情:
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();
我认为第一个选择返回一个Text,这意味着第二个选择可以找到它的.Value ...但是,没有:
'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();
答案 0 :(得分: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
。
答案 1 :(得分:2)
您需要致电.SelectMany()
以将Text
s(IEnumerable<IEnumerable<string>>
)的集合列表展平为一组Text
s(IEnumerable<string>
)