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 - 存储库模式,分页代码应该放在哪里? 的相关文章

  • 确保奥尔良管道执行中的消息顺序

    我有三种谷物 A B 和 C 在管道中执行不同的工作 GrainA会将结果传递给grainB grainB会将结果传递给grainC 我想保证连续的grain之间的顺序消息发送 这可以通过下面的方法来实现 client code forea
  • ASP.NET MVC,Bootstrap Tables,获取每列的值

    在 ASP NET MVC 中 我有一个操作 它接受有关行和列的用户输入 然后导航到根据用户输入生成所需行数和列数的操作 如下所示 Views div class container style width 1px div class ro
  • pubxml Web 发布工具事件生命周期

    我正在使用 Visual Studio 2012 中的 Web 发布工具发布到文件系统 我了解到我可以打开 Properties 文件夹中的 pubxml 来执行更高级的操作 我想要做的是在发布任务结束时运行命令行应用程序 我通常会在自定义
  • ASP.NET GridView 项目模板

    好的 我有一个 GridView 并且有一个列 如果文件存在 我希望将其作为链接 否则我只想将其作为标签 现在 我正在使用参数中传递的 Row 更改 RowDataBound 事件处理程序上的控件 我不太喜欢这个 因为我对列 ID 进行了硬
  • iTextSharp 从一页模板高效批量生成 PDF

    我正在使用 ITextSharp 生成多页 PDF 每个页面都有相同的模板 问题是 PDF 的物理大小会随着模板的大小而增长 I HAVE to use 阿克罗菲尔德 我怎么能够reduce最终文件大小 这是 pdf 处理程序的代码片段 p
  • ASP.NET Core MVC防伪

    尝试在核心 mvc 项目中打开防伪功能 但没有成功 做了什么 添加过滤器以自动检查每个 POST 请求的防伪令牌 services AddMvc o gt o Filters Add new AutoValidateAntiforgeryT
  • 如何发送电子邮件而不进入垃圾邮件

    MailAddress mailFrom new MailAddress email protected cdn cgi l email protection MailAddress mailTo new MailAddress email
  • 如何在登录名控件中显示用户名

    我有一个母版页 其中包含基于母版页的所有后续页面上显示的登录视图内容 我有一个用户名控件也嵌套在登录视图中 用于在用户登录时显示用户名 母版页中登录视图的代码显示如下 div class loginView div
  • 如何正确链接不同View之间

    我有一个master cshtml带有导航栏 我的第一个链接是另一个视图 ProjectManagement li a href Views ProjectManagement cshtml Project Management a li
  • 如何在 ASP.NET 中获取负载均衡器后面的主机名?

    我有几台服务器和一个负载均衡器 我想显示当前正在为该页面提供服务的服务器名称 我在用HttpContext Current Request ServerVariables SERVER NAME and HttpContext Curren
  • 将 NameValueCollection 绑定到 GridView?

    我应该使用哪种集合来将 NameValuecollection 转换为可绑定到 GridView 直接做的时候没效果 aspx cs 中的代码 private void BindList NameValueCollection nvpLis
  • 如何为客户端和服务器缓存设置不同的缓存过期时间

    我想让某些页面为客户端提供 10 分钟缓存 为服务器提供 24 小时缓存 原因是如果页面发生变化 客户端将在 10 分钟内获取更新版本 但如果没有任何变化 服务器只需每天重建一次页面 问题在于输出缓存设置似乎覆盖了客户端设置 这是我的设置
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • Microsoft.Extensions.Caching.Redis 选择与 db0 不同的数据库

    一个关于了解使用哪个redis数据库以及如何配置它的问题 我有一个默认值ASP NET Core Web 应用程序和默认配置的本地redis服务器 含15个数据库 通过包管理控制台我已经安装了 Install Package Microso
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 如何让 LinqToSql 将“索引提示”传递给 sql server?

    由于我们不能相信我们的客户会更新 sql server 中的索引统计信息等 因此我们过去不得不使用索引提示 http www sql server performance com tips hints general p1 aspx 由于我
  • 如何在 Web 表单中进行 Html.Encode

    我有一个 ASP NET Web 窗体应用程序 有一个带有文本框的页面 用户在其中输入搜索词用于查询数据库 我知道我需要防止 JavaScript 注入攻击 我该怎么做呢 在 MVC 中我会使用Html Encode Web 表单中似乎无法
  • 不支持 EF6 上下文类型“System.Data.Entity.Core.Objects.ObjectContext”

    我有一个使用 Visual Studio 2013 和 ADO NET 实体数据模型 EF6 创建的新项目 现在我必须使用一些动态数据函数 例如访问 MetaTable 对象 所以我添加以下代码 MetaModel model new Me
  • 如何从 Docker Hub 删除存储库

    如何从 Docker Hub 完全删除存储库 Docker 正在快速发展 他们的网站也是如此 这是从 docker hub Web 界面删除存储库的最新方法 首先 确保您已登录 hub docker com Simple 单击顶部的存储库链

随机推荐