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

时间:2013-04-02 16:08:09

标签: 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;

}

2 个答案:

答案 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,但值得注意的是此选项可用于更复杂的示例。