我有这段代码:
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解决方案,或两者兼而有之:)。
答案 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。