实体框架 - 基于NULLABLE参数的WHERE子句的LINQ语句

Sri*_*ddy 3 c# linq entity-framework

我有一个返回语言列表的方法.它有一个可以为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;

}
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 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;
}
Run Code Online (Sandbox Code Playgroud)

通过IQueryable<Language>这种方式使用,您可以确保只对数据库进行一次调用,而不管传递给此方法的参数是什么.

  • pswg声明将我们设置为IQueryable,因此您不会过滤两次.您正在构建语句并推迟执行.最后的ToList()调用只执行一次语句. (3认同)