ASP.NET MVC2 LINQ - 存储库模式,分页代码应该放在哪里?

2024-03-26

我正在努力添加用于分页的 HtmlHelper,但从性能和可维护性的角度来看,我不确定将分页代码的某些部分放在正确和/或最有益的位置。

我不确定 Linq to SQL 数据操作的 Skip()、Take() 和 Count() 部分是否应该位于存储库或控制器中。

我也不确定它们的顺序和使用位置是否会以任何方式影响性能。

根据我的理解,如果它们位于存储库中,那么它将如何工作:
1.我会将 pageIndex 和 pageSize 作为参数传递给存储库的方法,该方法从数据库中获取数据。
2.然后从数据库中获取完整的数据集。
3.然后将该完整数据集的 TotalItems 计数存储在变量中。
4.然后应用 Skip() 和 Take(),以便数据集仅保留我需要的页面。
5.在视图中将部分数据集显示为单个页面。

根据我的理解,如果它们生活在控制器中,那么它将如何工作: 1. 我将从存储库中获取完整的数据集并将其存储到控制器内部的变量中。 2. 然后获取完整数据集的 TotalItems 计数。 3. 然后应用 Skip() 和 Take(),以便数据集仅保留我需要的页面。 4. 在视图中将部分数据集显示为单个页面。

在控制器内部(我意识到我会错误地获取此处的页数而不是 TotalItems):


Character[] charactersToShow = charactersRepository.GetCharactersByRank(this.PageIndex, this.PageSize);
RankViewModel viewModel = new RankViewModel
{
    Characters = charactersToShow,
    PaginationInfo = new PaginationInfo
    {
        CurrentPage = this.PageIndex,
        ItemsPerPage = this.PageSize,
        TotalItems = charactersToShow.Count()
    }
};

存储库内部:


public Character[] GetCharactersByRank(int PageIndex, int PageSize)
{
    IQueryable characters = (from c in db.Characters
        orderby c.Kill descending
        select new Character {
            CharID = c.CharID,
            CharName = c.CharName,
            Level = c.Level
        });
    characters = PageIndex > 1 ? characters.Skip((PageIndex - 1) * PageSize).Take(PageSize) : characters.Take(PageSize);
    return characters.ToArray();
}

此代码是我如何实现存储库中的 Skip()、Take() 和 Count() 代码的部分示例。我实际上并没有实现获取和返回 TotalItems,因为那时我意识到我不知道放置它的正确位置。

我不确定将它们放在哪里的部分原因是我不知道 Linq to SQL 在幕后如何工作,因此我不知道如何优化性能。我也不知道在这种情况下这是否是一个问题。

当您在 Linq to SQL 上执行 .Count() 时,是否必须从数据库中获取所有记录? 如果我执行 .Count(),然后执行 .Skip() 和 .Take(),是否必须进行单独的查询? 在 .Skip() 和 .Take() 之前使用 .Count() 是否存在任何可能的性能问题?

这是我第一次使用 ORM,所以我不确定会发生什么。我知道我可以查看 Linq to SQL 正在运行的查询,但是我觉得听听在这种情况下有经验的人的意见会更好地利用我的时间。

我想更深入地了解这一点,任何见解将不胜感激。


我保留一个通用的PaginatedList我里面的类Helpers我还放置其他 Helper 类的文件夹。

PaginatedList 直接来自书呆子晚餐,看起来像这样。

public class PaginatedList<T>: List<T>
{
    public int PageIndex { get; private set; }
    public int PageSize { get; private set; }
    public int TotalCount { get; private set; }
    public int TotalPages { get; private set; }

    public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
    {
        PageIndex = pageIndex;
        PageSize = pageSize;
        TotalCount = source.Count();
        TotalPages = (int) Math.Ceiling(TotalCount / (double)PageSize);

        this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
    }

    public bool HasPreviousPage
    {
        get
        {
            return (PageIndex > 0);
        }
    }

    public bool HasNextPage
    {
        get
        {
            return (PageIndex + 1 < TotalPages);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC2 LINQ - 存储库模式,分页代码应该放在哪里? 的相关文章

随机推荐