单个语句查询

时间:2012-08-18 15:36:36

标签: c# linq extension-methods

我有这段代码:

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

我很感兴趣是否有办法将其缩短为一个语句,即避免变量 questionCategory 。我正在寻找Extesion方法或LINQ解决方案,或两者兼而有之:)。

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

通过这种方式,无需在QuestionCategories上检查空,最终结果是Select上的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
                                        }));

答案 2 :(得分: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;                                                 

答案 3 :(得分:0)

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

如果您未找到null,则要返回x.Type == (int)questionCategoryType

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

答案 4 :(得分: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。