ASP.NET MVC学习笔记

2019-05-11 20:02:20于海丽

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

使用起来很简单,用LINQ TO SQL得到一个IQueryable后,再用其New一个PaginatedList就表示一个已分页的数据集了

var posts = from post in db.BBSPosts
where post.CategoryID == id && post.ParentID == 0
orderby post.PostID descending
select post;
const int pageSize = 10;
var pagePosts = new PaginatedList<BBSPost>(posts, page ?? 0, pageSize);
return View(pagePosts);

posts是用linq to sql生成的一个IQueryable<BBSPost>对象,这时候SQL语句并没有执行,会延迟执行,再new一个PaginatedList<BBSPost>的时候会对其生成的SQL语句进行修改,最后把pagePosts传递给view层用就行了,View层我们使用了强类型的View,如下
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<SimpleBBS.Helpers.PaginatedList<SimpleBBS.Models.BBSPost>>" %>
页面上要显示上一页,下一页的链接,写起来也很简单

<div class="pagination">
<% if (Model.HasPreviousPage) { %>
<%= Html.RouteLink("上一页",
"Default",
new { page=(Model.PageIndex-1) }) %>
<% } %>
<% if (Model.HasNextPage) { %>
<%= Html.RouteLink("下一页",
"Default",
new { page = (Model.PageIndex + 1) })%>
<% } %>
</div>

6、查看LINQ TO SQL生成的SQL语句?

有人怀疑LINQ TO SQL的性能问题,认为它生成的语句不靠谱,其实它生成的语句都是参数化查询,一般的基于主键或者索引列的查询及大多数更新操作性能应该不会比手写SQL差,如果还是不放心的话,可以把LINQ TO SQL生成的SQL打印出来,以避免性能查的语句产生。
如下代码

var db = new BBSDbContext(conn);
var posts = from post in db.BBSPosts
where post.CategoryID == 1 && post.ParentID == 0
orderby post.PostID descending
select new {post.PostID, post.Title, post.Content};
db.Log = Response.Output; //跟踪自动生成的SQL语句
rpt1.DataSource = posts;
rpt1.DataBind(); //只有真正执行使用数据的语句时,SQL查询才会执行,在这之前语句只是语句,自动延迟执行的。

会在页面上看到LINQ TO SQL生成的SQL语句