惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
小众软件
小众软件
J
Java Code Geeks
V
Visual Studio Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
博客园 - 叶小钗
N
Netflix TechBlog - Medium
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
T
The Exploit Database - CXSecurity.com
The Hacker News
The Hacker News
Cisco Talos Blog
Cisco Talos Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
AWS News Blog
AWS News Blog
Webroot Blog
Webroot Blog
The Last Watchdog
The Last Watchdog
T
Threatpost
I
Intezer
T
Tenable Blog
L
LINUX DO - 热门话题
T
Tailwind CSS Blog
Scott Helme
Scott Helme
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Cybersecurity and Infrastructure Security Agency CISA
Engineering at Meta
Engineering at Meta
S
Schneier on Security
Recent Announcements
Recent Announcements
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Troy Hunt's Blog
量子位
H
Hacker News: Front Page
V2EX - 技术
V2EX - 技术
Google Online Security Blog
Google Online Security Blog
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
博客园 - Franky
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - 克隆

SVN快速入门(TSVN) C# HttpWebRequest提交数据方式浅析 简单的3个SQL视图搞定所有SqlServer数据库字典 简单统计SQLSERVER用户数据表大小(包括记录总数和空间占用情况) 敏捷开发Scrum 学习笔记,适于移动开发 团队的职责和任务之间的关系 精心收集的jQuery常用的插件1000 24款超实用的Web 2.0风格翻页代码 (转)ASP.NET页面打印技术的总结 [转]数据库设计 Step by Step (5) [转]jquery插件弹出div SQLServer2008/2005 生成数据字典SQL语句 SQL HierarchyID 数据类型 OSWorkflow表结构分析 javascript动态创建VML [转]由于项目原因看了一下vml,写了一个Web工作流的设计器雏形! VML流程图 启用IIS的Gzip压缩 IIS压缩
【转】使用 Entity Framework + ListView + DataPager 实现数据分页
克隆 · 2011-10-06 · via 博客园 - 克隆

l       Web程序运行时,页面效果概览

未加载数据时的效果

执行了数据库查询,没有符合条件的结果时的效果

执行了数据库查询,返回10条查询结果时的效果(PageSize设置为5,所以进行了分页)

点击列标题进行排序

DataPager分页控件

l       如何实现自定义组合条件的复杂查询?

 

实现步骤如下:

1.         QueryCondition

首先定义一个 QueryCondition 类,包含了查询条件的组合,以及排序规则。

class中的各个字段都为可空类型,为空即表示不依据该字段查询,从而不需要将参数设置为0或者-1或者“”以表示同样的目的。

其中,PatternQueryKeywordsScope用于定义Keywords查询条件将要覆盖的范围,是标记为 [Flag] 属性的枚举类型,可以将多个枚举值通过 | 运算符累加起来,表示AND或者OR的关系。

PatternQueryOrderBy 则是定义了排序的字段,该字段为nullable,如果为null,则表示由BIZ层业务逻辑代码决定默认的排序字段(通常为IDDateTime等)。

IsAsc属性(bool类型)定义了排序顺序(升序、降序)。

1.         BIZ业务层方法

业务层代码提供了一个 QueryPattern 静态方法,返回类型为:

/// <summary>

/// 根据查询条件,搜索符合条件的Pattern数据列表。

/// </summary>

/// <param name="con">查询条件对象</param>

/// <param name="startRowIndex">开始的记录数(PageSize * PageIndex</param>

/// <param name="maxRowsCount">最大记录数目(PageSize</param>

/// <returns></returns>

public static List<Pattern> QueryPattern(PatternQueryCondition con, int

startRowIndex, int maxRowsCount){…}

该方法中,首先判断 PatternQueryCondition 对象是否为空,为空的话,则新建该对象,并设置默认的排序规则。

然后,根据不同的查询参数,调用各自的查询业务逻辑代码。

if (con.CreateUserID.HasValue)

patterns = patterns.Where(p => p.CreateUser.UserID == con.CreateUserID.Value);

if (string.IsNullOrEmpty(con.CreateUserName) == false)

patterns = patterns.Where(p => p.CreateUser.DisplayName.Contains(con.CreateUserName));

if (con.From.HasValue)

patterns = patterns.Where(p => p.CreateTime >= con.From.Value);

if (con.To.HasValue)

patterns = patterns.Where(p => p.CreateTime <= con.To.Value);

搜索完成后,再处理排序。

也可以先统一调用OrderBy方法,排序完成后根据IsAsc的值,如果IsAsc==false,再调用Reverse方法即进行反序操作。

switch (con.OrderBy.Value)

{

// other cases…

case PatternQueryOrderBy.CreateDate:

default:

patterns = con.IsAsc == true ? patterns.OrderBy(p => p.CreateTime) : patterns.OrderByDescending(p => p.CreateTime);

break;

}

最后,进行分页操作,获得所需要的记录列表。

return patterns.Skip(startRowIndex).Take(maxRowsCount).ToList();

2.         Web项目中,前端页面代码(.aspx)

显示查询结果的数据列表使用 DataTable 布局,Header(列标题,可点击排序)和 Footer(显示记录数和分页控件)各占一个TR

中间的数据部分使用了ASP.NET 3.5新的ListView控件,其中LayoutTemplate为空(都在控件外面定义了),仅定义了ItemTemplateEmptyDataTemplate

分页使用了ASP.NET 3.5新的DataPager控件,定义如下。

<asp:DataPager ID="dataPagerResults" runat="server" PageSize="5" PagedControlID="listViewResult">

<Fields>

 <asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="True" ShowNextPageButton="False" FirstPageText="◄◄" LastPageText="►►" NextPageText="►" PreviousPageText="◄" />

<asp:NumericPagerField CurrentPageLabelCssClass="currentPage" />

<asp:NextPreviousPagerField ButtonType="Link" ShowLastPageButton="True" ShowPreviousPageButton="False" FirstPageText="◄◄" LastPageText="►►" NextPageText="►" PreviousPageText="◄" />

</Fields>

</asp:DataPager>

具体分页操作的执行,使用了 ObjectDataSource 控件,其中仅需要指定2个查询方法和查询参数名称。

<asp:ObjectDataSource ID="ObjectDataSourcePatterns" runat="server"

SelectMethod="QueryPatterns" TypeName="PatternsAndPractices.WebApp.PnP.Patterns" MaximumRowsParameterName="maxRowsCount" EnablePaging="True" SelectCountMethod="GetQueryCount">

</asp:ObjectDataSource>

3.         Web项目中,页面后台代码(.aspx.cs)

相关页面的后台代码中,首先需要响应 Query Button Click事件,根据用户的输入和选择,构造对应的 PatternQueryCondition 对象,然后调用执行数据库查询的方法。

在页面代码中,需要定义如下2个方法,一个用于执行具体的查询操作,一个用于获得该查询条件下,符合条件的记录总数(从而计算出分页总数)。

public List<Pattern> QueryPatterns(int startRowIndex, int maxRowsCount)

{

return PatternManager.QueryPattern(CurrentPatternQueryCondition, startRowIndex, maxRowsCount);

}

public int GetQueryCount()

{

return PatternManager.GetQueryCount(CurrentPatternQueryCondition);

}