我有一个返回语言列表的方法。它有一个可以为null的languageId参数。如果传递,该方法返回该语言,否则返回语言列表。
我想知道我是否可以简化这段代码,在一个语句中包含select和where子句。
public List<Language> GetLanguageList(LanguageMapper ctx, int? languageId)
{
List<Language> languages = ctx.LANGUAGELIST
.Select(e => new Language()
{
LanguageId = e.LANGUAGEID,
LanguageName = e.LANGUAGE
})
.ToList();
if (languageId.HasValue)
{
languages = languages.Where(x => x.LanguageId == languageId).ToList();
}
return languages;
}
答案 0 :(得分:5)
只需在.Where
之前执行.Select
,就像这样:
public List<Language> GetLanguageList(LanguageMapper ctx, int? languageId)
{
var query = ctx.LANGUAGELIST.AsQueryable();
if (languageId.HasValue)
{
query = query.Where(x => x.LanguageId == languageId.Value);
}
List<Language> languages = query.Select(e => new Language()
{
LanguageId = e.LANGUAGEID,
LanguageName = e.LANGUAGE
})
.ToList();
return languages;
}
通过以这种方式使用IQueryable<Language>
,您可以确保只对数据库进行一次调用,而不管传递给此方法的参数是什么。
答案 1 :(得分:4)
您可以在where子句中包含HasValue
检查:
public List<Language> GetLanguageList(LanguageMapper ctx, int? languageId)
{
List<Language> languages = ctx.LANGUAGELIST
.Where(e => !languageId.HasValue || e.LanguageId == languageId)
.Select(e => new Language()
{
LanguageId = e.LANGUAGEID,
LanguageName = e.LANGUAGE
})
.ToList();
return languages;
}
注意:pswg的答案将导致在此特定示例中languageId
为空的实例中更清晰,更高效的sql,但值得注意的是此选项可用于更复杂的示例。