`
yesjavame
  • 浏览: 687487 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

使用Dynamic LINQ实现Ext Grid的远程排序

阅读更多

<!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]> <mce:style><! /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} table.MsoTableGrid {mso-style-name:网格型; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --> <!--[endif]-->

要实现Ext Grid的远程排序其实很简单,只要修改查询语句的排序关键字就可以了,但是,如果你的项目是使用Linq进行开发的,会发现动态修改排序关键字并不是那么容易的事,解决办法就是使用LINQ Dynamic Query LibraryLINQ Dynamic Query Library是一个很实用很强大的库函数,通过该库,可以轻松实现一些需要通过动态参数实现的Linq查询。

本文将通过一个实例演示如何使用LINQ Dynamic Query Library实现Ext Grid的远程排序。

LINQ Dynamic Query Library可以在VS2008的例程里找到,也可以从以下链接下载:

本例子将使用SQL Server的“NORTHWND”样例数据库。Ext Grid显示的是Employees表的数据。

以下是客户端的完整代码:

<html>

<head>

<title></title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" xmlns="" />

<link rel="stylesheet" type="text/css" href="lib/ext/resources/css/ext-all.css" />

<link rel="stylesheet" type="text/css" href="css/application.css" />

</head>

<script type="text/javascript" src="lib/ext/ext-base.js"></script>

<script type="text/javascript" src="lib/ext/ext-all.js"></script>

<script type="text/javascript" src="lib/ext/locale/ext-lang-zh_CN.js"></script>

<body scroll="no">

<div id="loading-mask"></div>

<div id="loading">

<div class="loading-indicator"><img alt="" src="lib/ext/resources/images/default/shared/large-loading.gif" width="32" height="32" style="margin-right:8px;" align="absmiddle"/>正在加载...</div>

</div>

<script type="text/javascript">

var app={}

Ext.onReady(function(){

Ext.BLANK_IMAGE_URL='lib/ext/resources/images/default/s.gif';

Ext.QuickTips.init();

Ext.form.Field.prototype.msgTarget = 'side';

Ext.Msg.minWidth=300;

app.store=new Ext.data.Store({

url:'employees_action.ashx?act=list',

baseParams:{},

reader:new Ext.data.JsonReader({

totalProperty: "results",

root:"rows",

id:"id"

},[{name: 'id',type:'int'},{name:'lastname'},{name:'firstname'},

{name:'title'},{name:'titleofcourtesy'},{name:'city'},

{name:'address'},{name:'region'},{name:'postalcode'},{name:'homephone'},{name:'country'},

{name:'birthdate',type: 'date',dateFormat:'Y-m-d'},

{name:'hiredate',type: 'date',dateFormat:'Y-m-d'}

]),

remoteSort: true

}) //store

app.pageToolbar=new Ext.PagingToolbar({

pageSize:3,displayInfo:true,store:app.store

});

app.grid=new Ext.grid.GridPanel({layout:'fit',

store:app.store, autoExpandColumn:2,tbar:app.pageToolbar,

columns:

[

{id:'id',header: "ID",width:80,dataIndex:'id',sortable: true},

{header: "FirstName",width:80, dataIndex:'firstname',sortable: true},

{header: "LastName",width:80, dataIndex:'lastname',sortable: true},

{header: "Title",width:80, dataIndex:'title',sortable: true},

{header: "Title of Courtesy",width:80, dataIndex:'titleofcourtesy',sortable: true},

{header: "City",width:80, dataIndex:'city',sortable: true},

{header: "Region",width:80, dataIndex:'region',sortable: true},

{header: "Country",width:80, dataIndex:'country',sortable: true},

{header: "Postalcode",width:80, dataIndex:'postalcode',sortable: true},

{header: "Homephone",width:80, dataIndex:'homephone',sortable: true},

{header: "Birthdate", width: 120,dataIndex:'birthdate',sortable: true,renderer:Ext.util.Format.dateRenderer('Y-m-d')},

{header: "Hiredate", width: 120,dataIndex:'hiredate',sortable: true,renderer:Ext.util.Format.dateRenderer('Y-m-d')}

]

})

var viewport = new Ext.Viewport({layout:'fit',items:[app.grid]});

app.store.load();

setTimeout(function(){

Ext.get('loading').remove();

Ext.get('loading-mask').fadeOut({remove:true});

}, 250);

})//onReady

</script>

</body>

</html>

代码很简单,定义了一个StorePagetoolBarGrid。因为Employees表数据只有9条,所以设置了每页3条数据。在Store定义中将remoteSort设置为true,说明数据要实现远程排序。Grid的每一列都将sortable属性设置为true,说明都可以通过单击Grid的列标题实现排序。

以下是服务器端的完整代码:

<%@ WebHandler Language="C#" Class="employees_action" Debug="true" %>

using System;

using System.Web;

using System.Linq;

using System.Linq.Dynamic;

using System.Collections;

using System.Collections.Generic;

using System.Web.Security;

using LitJson;

public class employees_action : IHttpHandler

{

public void ProcessRequest (HttpContext context) {

string action = context.Request.Params["act"];

string outputStr = "";

if (action == null) action = "";

switch (action.ToLower())

{

case "list":

outputStr = List(context);

break;

default:

outputStr = HDQ.Functions.WriteJsonResult(false, "错误的操作类型!");

break;

}

context.Response.ContentType = "text/javascript";

context.Response.Write(outputStr);

}

public bool IsReusable {

get {

return false;

}

}

private string List(HttpContext context)

{

int limit=0;

int.TryParse(context.Request.Params["limit"], out limit);

if (limit == 0) limit = 3;

int start=0;

int.TryParse(context.Request.Params["start"], out start);

string orderColumn = context.Request.Params["sort"];

string orderBy = context.Request.Params["dir"] == "ASC" ? "" : "descending";

switch (orderColumn)

{

case "id":

orderColumn = "EmployeeID";

break;

case "lastname":

orderColumn = "LastName";

break;

case "firstname":

orderColumn = "FirstName";

break;

case "title":

orderColumn = "Title";

break;

case "titleofcourtesy":

orderColumn = "TitleOfCourtesy";

break;

case "birthdate":

orderColumn = "BirthDate";

break;

case "hiredate":

orderColumn = "HireDate";

break;

case "address":

orderColumn = "Address";

break;

case "city":

orderColumn = "City";

break;

case "region":

orderColumn = "Region";

break;

case "postalcode":

orderColumn = "PostalCode";

break;

case "country":

orderColumn = "Country";

break;

case "homephone":

orderColumn = "HomePhone";

break;

default:

orderColumn = "EmployeeID";

break;

}

DBDemosDataContext dc = new DBDemosDataContext();

int recordCount=0;

JsonWriter jw = new JsonWriter();

jw.WriteObjectStart();

jw.WritePropertyName("rows");

jw.WriteArrayStart();

recordCount = dc.Employees.Count();

if (start > recordCount) start = 0;

var q=dc.Employees.OrderBy(orderColumn + " " + orderBy).Skip(start).Take(limit);

foreach (var c in q)

{

jw.WriteObjectStart();

jw.WritePropertyName("id");

jw.Write(c.EmployeeID);

jw.WritePropertyName("firstname");

jw.Write(c.FirstName);

jw.WritePropertyName("lastname");

jw.Write(c.LastName);

jw.WritePropertyName("title");

jw.Write(c.Title);

jw.WritePropertyName("titleofcourtesy");

jw.Write(c.TitleOfCourtesy);

jw.WritePropertyName("address");

jw.Write(c.Address);

jw.WritePropertyName("city");

jw.Write(c.City);

jw.WritePropertyName("region");

jw.Write(c.Region);

jw.WritePropertyName("country");

jw.Write(c.Country);

jw.WritePropertyName("postalcode");

jw.Write(c.PostalCode);

jw.WritePropertyName("homephone");

jw.Write(c.HomePhone);

jw.WritePropertyName("birthdate");

jw.Write(c.BirthDate == null ? "" : Convert.ToDateTime(c.BirthDate).ToString("yyyy-MM-dd"));

jw.WritePropertyName("hiredate");

jw.Write(c.HireDate == null ? "" : Convert.ToDateTime(c.HireDate).ToString("yyyy-MM-dd"));

jw.WriteObjectEnd();

}

jw.WriteArrayEnd();

jw.WritePropertyName("results");

jw.Write(recordCount.ToString());

jw.WriteObjectEnd();

return jw.ToString();

}

}

代码中ProcessRequest方法根据提交的参数action执行对应的方法。本文主要是执行List方法。

List方法的开头首先获取了客户端提交的几个参数,参数对应的说明请看下表:

参数

说明

limit

每页总数,本例子是3

start

提取数据开始位置

sort

要排序的列

dir

排序顺序

获取数据后需要对排序的列名和顺序做一下转换,以下语句就是实现排序顺序的转换:

string orderBy = context.Request.Params["dir"] == "ASC" ? "" : "descending";

列名的转换则通过switch语句实现。如果在客户端定义的列名与数据库的真实列名相同,也可以不实施转换。不过,出于安全考虑,建议无论如何,还是要实行转换。

转换完成后,就可以定义查询语句了,相当的简单:

var q=dc.Employees.OrderBy(orderColumn + " " + orderBy).Skip(start).Take(limit);

将列名变量和顺序变量组合成字符串作为OrderBy方法的参数就可以了。LINQ Dynamic Query Library会自动重新生成Linq语句执行。

后面的代码就是将查询结果组合成Json格式数据输出。

如果不使用LINQ Dynamic Query Library,远程排序的实现最直接的方法就是使用switch语句,根据提交的列和排序顺序写不同的Linq语句,就不如本例的代码那么简洁了。

以下是本例程的代码下载地址:

http://download.csdn.net/source/1212462

分享到:
评论

相关推荐

    .net linq动态组合查询条件及排序

    本文将深入探讨如何在.NET中利用LINQ实现动态组合查询条件及排序。 首先,让我们了解什么是LINQ。LINQ是一种内置于C#和Visual Basic中的特性,它统一了对各种数据源(如数据库、XML、数组等)的查询方式。通过使用...

    ExtJs+WCF+LINQ实现分页Grid

    ExtJs+WCF+LINQ实现分页Grid

    Dynamic LINQ to NHibernate

    - **主要类库**:`System.Linq.Dynamic` 命名空间下的 `DynamicQueryable` 类是实现 Dynamic LINQ 的核心组件。 - **关键方法**: - **`Where` 方法**:用于添加过滤条件。 - **`Select` 方法**:用于选择特定...

    EXT & LINQ DEMO

    EXT & LINQ DEMO是一个基于Visual Studio 2008的项目示例,它展示了如何将EXT JS前端框架与LINQ后端查询技术相结合,创建一个功能丰富的Web应用程序。EXT JS是一个强大的JavaScript库,用于构建用户界面,而LINQ...

    Linq排序

    虽然Linq提供了简洁的语法,但在大量数据的排序中,直接使用`Array.Sort()`或`List&lt;T&gt;.Sort()`方法可能会更高效。这些方法通常对内存的需求较低,但不支持复杂的排序逻辑。 8. **并行排序** .NET Framework 4.0及...

    MVC+LINQ+EXT的个人记账系统

    个人开发的采用三层架构+mvc+linq+ext的记账系统。对于学习mvc框架或是linq to sql技术或是ext,或是三层框架架构都是很好的例子。数据库用的是sql2008,如果没装sql 2008的朋友也没关系,本人提供了表创建的SQL文件...

    System.Linq.Dynamic.dll

    System.Linq.Dynamic.dll是.NET框架的一个重要组件,它为C#程序员提供了使用字符串来构建和执行LINQ(Language Integrated Query,语言集成查询)的能力。这个库使得在运行时动态构建查询表达式成为可能,极大地扩展...

    ExtJs_Wcf_Linq_PageGrid

    在“ExtJs_Wcf_Linq_PageGrid”中,LINQ可能被用于执行SQL查询,过滤、排序和分组数据,以满足前端的分页和检索需求。此外,LINQ还简化了数据的导入和导出功能,通过提供强大的数据操作和转换能力。 项目中的...

    linq实现OA项目

    2. **业务逻辑层**:在业务逻辑层,LINQ可以方便地进行复杂的数据过滤、排序、分组等操作。例如,可以通过LINQ轻松获取某个时间段内的所有未处理审批请求,或者查找特定用户的所有日程。这种强类型的安全性和编译时...

    Linq动态查询、行转列

    在提供的项目文件中,`DynamicLinq.sln`是一个解决方案文件,包含了一个名为`DynamicLinq`的项目,很可能是用于实现动态LINQ查询的功能。`DataTable_RowToColumn`可能是一个示例项目,展示了如何将`DataTable`中的...

    linq实现分页

    此代码类很好的用linq技术实现分页,在这将他分享给各位有需要的人。

    System.linq.Dynamic

    在提供的文件中,`System.Linq.Dynamic.dll`是包含动态查询库实现的动态链接库文件,可以直接在项目中引用以使用其功能。而`Microsoft Public License (Ms-PL).pdf`则是该库的许可协议,它遵循的是Microsoft Public ...

    ASP.NET结合ExtJs+WCF+LINQ实现的分页Grid列表

    在本示例中,它与ExtJs、WCF(Windows Communication Foundation)和LINQ(Language Integrated Query)相结合,实现了一个分页Grid列表,这是一个高效且用户友好的数据展示方案。 ExtJs是一个流行的JavaScript库,...

    使用linq实现rss聚合

    总结,通过使用Linq,我们可以轻松地实现RSS聚合功能,其简洁的语法和强大的查询能力使得处理XML数据变得非常直观。无论你是初学者还是经验丰富的开发者,掌握Linq都是提升.NET开发效率的重要一步。在实际项目中,...

    c#使用Linq实现SQL数据库的增、删、改、查

    本教程将详细讲解如何使用C#的LINQ来实现SQL数据库的增、删、改、查操作。 首先,我们需要引入必要的命名空间,这包括`System.Linq`和`System.Data.Linq`。`System.Linq`提供了用于查询的扩展方法,而`System.Data....

    Kendo.DynamicLinqCore:Kendo.DynamicLinqCore通过Dynamic Linq for .Net Core App(1.x〜3.x)实现服务器分页,过滤,排序,分组和聚合到Kendo UI

    Kendo.DynamicLinqCore通过Dynamic Linq for .Net Core App(1.x〜3.x)实现服务器分页,过滤,排序,分组和聚合到Kendo UI。 先决条件 .Net核心1〜2 没有任何 .Net核心3 您必须将自定义...

    linq to sql实现分层与gridview使用实现增删改

    我们可以将LINQ查询结果绑定到GridView,从而实现数据的展示、排序、分页和编辑功能。例如,我们可以在页面的后台代码中执行LINQ查询,并将结果传递给GridView: ```csharp var students = (from s in db.Students ...

    winform使用linq实现datagridview分页功能

    vs2015实现功能,读取本地json文件用来当作数据源。使用linq语法分页查询显示。 有兴趣的可以拿去参考。 dgv.DataSource = groups.Skip(pageIndex).Take(pageSize).ToList();

    dynamic-linq-query-builder-master.zip

    这个压缩包"dynamic-linq-query-builder-master.zip"包含了该库的源代码和相关资源。 jQuery-QueryBuilder的核心功能包括: 1. **可视化构建**:用户可以通过拖拽不同的条件、操作符和字段到界面上,构建他们的...

Global site tag (gtag.js) - Google Analytics