gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:58:53 28 4
gpt4 key购买 nike

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

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

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

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

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

在 Controller 内部(我意识到我会在这里错误地获取页数而不是 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 正在运行的查询,但是我觉得听听在这种情况下有经验的人的意见会更好地利用我的时间。

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

最佳答案

我在 Helpers 文件夹中保留了一个通用的 PaginatedList 类,其中还放置了其他 Helper 类。

PaginatedList 直接来自 NerdDinner,它看起来像这样。

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);
}
}
}

关于ASP.NET MVC2 LINQ - 存储库模式,分页代码应该放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4074894/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com