1

I have this code:

var questionCategory = questionnaire.QuestionCategories
    .First(x => x.Type == (int)questionCategoryType);
return questionCategory.Questions.Select(x => new 
    {
       Id = x.Id,
       Text = x.Text,
    });

I'm interested if there is a way of shortening this into one statement, i.e. avoid making variable questionCategory . I'm looking for Extesion method or LINQ solution, or little bit of both :) .

4

5 回答 5

1

可能不是最好的方法,但是您可以轻松地将代码简化为一行,而没有像这样的变量存储:

return questionnaire.QuestionCategories.First(x => x.Type == (int)questionCategoryType)
                    .Questions.Select(x => new {Id = x.Id, Text = x.Text});
于 2012-08-18T15:41:15.433 回答
1

用这种方式,不用检查 null on QuestionCategories,最终结果是Selecton Questions,所以你不需要使用First,而是使用Where

return questionnaire.QuestionCategories 
     .Where(x => x.Type == (int)questionCategoryType) 
     .SelectMany(c => c.Questions.Select(q => new
                                        {
                                            Id = q.Id,
                                            Text = q.Text
                                        }));
于 2012-08-18T15:42:01.127 回答
1

我建议使用FirstOrDefault而不是First,这样当序列为空或没有任何元素与您的谓词匹配时,您不会收到 InvalidOperationException。

此外,您应该在第一次查询后检查 null 并为这种情况提供默认值。这不是你要求的,但它更具防御性。

var questionCategory = questionnaire.QuestionCategories.FirstOrDefault(x => x.Type == (int)questionCategoryType);

return questionCategory != null
        ? questionCategory.Questions.Select(x => new 
                                                 {
                                                    Id = x.Id,
                                                    Text = x.Text,
                                                 })
        : someDefaultValue;                                                 
于 2012-08-18T15:51:25.087 回答
0
return questionnaire.QuestionCategories.First(x => x.Type == (int)questionCategoryType)
            .Questions.Select(x => new { Id = x.Id, Text = x.Text, });

of if you would like to return null if x.Type == (int)questionCategoryType is not found:

return questionnaire.QuestionCategories.FirstOrDefault(x => x.Type == (int)questionCategoryType)
            .Questions.Select(x => new { Id = x.Id, Text = x.Text, });
于 2012-08-18T15:39:03.883 回答
0

使用First强制执行查询(枚举导航属性也是如此questionnaire.QuestionCategories)。为了不发出多个查询,应避免这种情况。

return from qc in dataContext.QuestionCategories
       where qc.QuestionaireID == questionnaire.ID //guessing names here
       where qc.Type == (int)questionCategoryType
       from q in qc.Questions
       select new 
    {
       Id = q.Id,
       Text = q.Text,
    };

这将发出一个查询,将所有工作远程转移到 SQL Server。

于 2012-08-18T16:16:53.567 回答