构造linq查询

时间:2011-05-31 02:58:14

标签: c# asp.net-mvc-3 linq-to-entities

我有一个问题(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();

2 个答案:

答案 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>