构造linq查询
本文关键字:查询 linq 构造 | 更新日期: 2023-09-27 17:57:56
我有一个问题(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>'
也许我不能在select中有select。。。和:
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();
您需要使用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
。
您需要调用.SelectMany()
来将Text
s(IEnumerable<IEnumerable<string>>
)的集合列表展平为单个Text
s(IEnumerable<string>
)集合。