c# - 使用 Linq 查询 + 可选参数避免重复代码

标签 c# linq refactoring dry

给定代码:

/// <summary>
/// Get a games high scores
/// </summary>
public static List<Score> GetGameHighScores(int gameID, HighScoreType type, int? skip = null, int? take  = null)
{
    var r = new List<Score>();

    using (var db = new ArcadeContext())
    {
        var q = new List<ArcadeScore>();

        if (skip != null && take != null)
        {
            switch (type)
            {
                case HighScoreType.ScoreRank:
                    q =
                        db.ArcadeScores.Where(c => c.GameID == gameID && c.ScoreRank > 0)
                            .OrderBy(c => c.ScoreRank)
                            .Skip(skip.Value)
                            .Take(take.Value)
                            .ToList();
                    break;
                case HighScoreType.UserRank:
                    q =
                        db.ArcadeScores.Where(c => c.GameID == gameID && c.UserRank > 0)
                            .OrderBy(c => c.UserRank)
                            .Skip(skip.Value)
                            .Take(take.Value)
                            .ToList();
                    break;
            }
        }
        else
        {
            switch (type)
            {
                case HighScoreType.ScoreRank:
                    q =
                        db.ArcadeScores.Where(c => c.GameID == gameID && c.ScoreRank > 0)
                            .OrderBy(c => c.ScoreRank)
                            .ToList();
                    break;
                case HighScoreType.UserRank:
                    q =
                        db.ArcadeScores.Where(c => c.GameID == gameID && c.UserRank > 0)
                            .OrderBy(c => c.UserRank)
                            .ToList();
                    break;
            }
        }
        r.AddRange(q.Select(arcadeScore => new Score(arcadeScore)));
    }
    return r;
} 

skiptake 是可选参数(在需要分页时使用),获取正确记录的最佳方法是什么而不像上面那样重复自己?

最佳答案

与其在四个单独的查询之间切换,不如根据您的条件构建单个查询:

IQueryable<Score> query = db.ArcadeScores.Where(c => c.GameID == gameID);

switch(type)
{
    case HighScoreType.ScoreRank:
        query = query.Where(c => c.ScoreRank > 0).OrderBy(c => c.ScoreRank);
        break;
    case HighScoreType.UserRank:
        query = query.Where(c => c.UserRank > 0).OrderBy(c => c.UserRank);
        break;
}

if (skip.HasValue && take.HasValue)
   query = query.Skip(skip.Value).Take(take.Value);

return query.ToList();

关于c# - 使用 Linq 查询 + 可选参数避免重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17405348/

相关文章:

c# - 我怎样才能把这个字符串拆分成一个数组?

sql-server - LINQ To SQL可以生成无效的SQL吗?

c# - 使用 LINQ to SQL 和 Include() 进行预加载

c++ - 非成员非 friend 函数与私有(private)函数

c# - 将一个类的对象转换为另一个类的对象

c# - 这是 MiscUtils 中的错误吗?

javascript - 从对象生成的 AngularJS 选择框

c# - ReSharper:重构以消除中间接口(interface)

c# - PhantomJS 传递 HTML 字符串并返回页面源代码

C# LINQ 顺序错误?