3

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

}
4

2 回答 2

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>以这种方式使用,您可以确保只对数据库进行一次调用,而不管传递给此方法的参数是什么。

于 2013-04-02T16:11:04.847 回答
4

您可以HasValue在 where 子句中包含检查:

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在这个特定示例中为 null 的实例中更清洁、更高效的 sql,但值得一看的是,此选项可用于更复杂的示例。

于 2013-04-02T16:14:13.227 回答