构造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();

构造linq查询

您需要使用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>)集合。