jqGridLINQ和匿名类型jqGrid采用如下JSON格式:{"total":"5","page":"2","records":"55",“行”:[{“id”:“21”,“单元格”:[“cell11”,“cell12”,“cell13”]},{“id”:“22”,“单元格”:[“cell21”,"cell22","cell23"]},...{"id":"30","cell":["cell31","cell32","cell33"]},]}我想做一个可能重复使用以通过AJAX将数据传回jqGrid的方法。varresult=new{total=(int)数学。Ceiling((double)totalCount/PageSize),page=PageIndex,records=totalCount,rows=data.Select((d,id)=>new{id,cell=d.SerializeGridParameters()}).ToArray()};如您所见,目前我设法在不费吹灰之力的情况下添加了索引,但我在处理字段数据时遇到了问题。到目前为止,我已经设法通过使用接口来处理它:publicinterfaceIGridParameterListable{ListSerializeGridParameters();}对于我的数据(这是一个IEnumerablewhereT:IGridParameterListable)。事情是我宁愿有一个通用方法,只是盲目地将对象属性值转换为List..听起来不太可爱,我知道,我对其他想法持开放态度。我想尽可能避免在客户端和服务器端复制网格的数据结构。这不是答案,只是一些源代码如果有人想要我的ASP.NETWebForms的jqGrid实现,我会在此处发布代码,因为这很难做到。首先,一些JSON类:publicclassGridFilter{publicstringgroupOp{get;放;}publicGridRule[]规则{get;放;}}publicclassGridRule{publicstringfield{get;放;}publicstringop{get;放;}公共字符串数据{得到;放;}}publicclassGridSettings{publicboolIsSearch{get;放;}publicintPageSize{得到;放;}publicintPageIndex{得到;放;}publicstringSortColumn{get;放;}publicstringSortOrder{得到;放;}publicGridFilterWhere{get;另外,我不太关心单个过滤器,所以我只支持多种过滤器模式(我认为这肯定更好)。现在,对于实际的实现...首先,我们需要一些LINQ扩展方法来对数据进行排序和排序。这些如下:publicstaticIQueryableOrderBy(thisIQueryablequery,stringsortColumn,stringdirection){if(string.IsNullOrEmpty(sortColumn))returnquery;stringmethodName=string.Format("OrderBy{0}",direction.ToLower()=="asc"?"":"descending");ParameterExpressionparameter=Expression.Parameter(query.ElementType,"p");MemberExpressionmemberAccess=null;foreach(varpropertyinsortColumn.Split('.'))memberAccess=MemberExpression.Property(memberAccess??(parameterasExpression),property);LambdaExpressionorderByLambda=Expression.Lambda(memberAccess,parameter);MethodCallExpression结果=Expression.Call(typeof(Queryable),methodName,new[]{query.ElementType,memberAccess.Type},query.Expression,Expression.Quote(orderByLambda));返回查询.Provider.CreateQuery(结果);}publicstaticIQueryableWhere(thisIQueryablequery,stringcolumn,objectvalue,stringoperation){if(string.IsNullOrEmpty(column))returnque赖;ParameterExpressionparameter=Expression.Parameter(query.ElementType,"p");MemberExpressionmemberAccess=null;foreach(varpropertyincolumn.Split('.'))memberAccess=MemberExpression.Property(memberAccess??(parameterasExpression),property);//更改参数值类型//从字符串ConstantExpressionfilter=Expression.Constant(Convert.ChangeType(value,memberAccess.Type))获取bool所必需的;//开关操作LambdaExpressionlambda=null;switch(operation){case"eq"://equal{lambda=Expression.Lambda(Expression.Equal(memberAccess,filter),parameter);休息;}case"ne"://不等于{lambda=Expression.Lambda(Expression.NotEqual(memberAccess,filter),parameter);休息;}case"cn"://contains{Expressioncondition=Expression.Call(memberAccess,typeof(string).GetMethod("Contains"),Expression.Constant(value.ToString()));lambda=Expression.Lambda(条件,参数);休息;}}var结果=表达式sion.Call(typeof(Queryable),"Where",new[]{query.ElementType},query.Expression,lambda);返回查询.Provider.CreateQuery(结果);搜索的实际实现,作为偏好,我将其作为我的GridSettings类中的成员方法,但它也可以是IQueryable的扩展方法publicstringSerializeQuery(IQueryablequery,Func>select){//过滤if(IsSearch&&Where.rules!=null){if(Where.groupOp=="AND")//TODO:INSENSITIVEEQUALS,YunenumGridGroupOperation.And.Name(){foreach(VarruleinWhere.rules)query=query.Where(rule.field,rule.data,rule.op);}elseif(Where.groupOp=="OR")//TODO:INSENSITIVEEQUALS,YunenumGridGroupOperation.Or.Name(){vartemp=(newList()).AsQueryable();foreach(varruleinWhere.rules){vart=query.Where(rule.field,rule.data,rule.op);temp=temp.Concat(t);}//删除重复记录query=temp.Distinct();}}//排序query=query.OrderBy(SortColumn,SortOrder);//计数vartotalCount=query.Count();//分页vardata=query.Skip((PageIndex-1)*PageSize).Take(PageSize);//转换为网格格式varresult=new{total=(int)Math.Ceiling((double)totalCount/PageSize),page=PageIndex,records=totalCount,rows=data.Select((d,id)=>new{id,cell=select(d)}).ToArray()};返回JsonConvert.SerializeObject(结果);然后,对于实际服务,我们需要这样的片段:[WebService(Namespace="http://tempuri.org/")][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)][ToolboxItem(false)][ScriptService]publicclassGridTestService:System.Web.Services.WebService{[WebMethod][ScriptMethod]publicstringGetData(GridSettingsgrid){varquery=newFakeComputersRepository().Computers();varresponse=grid.SerializeQuery(query,d=>newList{d.ID.ToString(),d.IsOnline.ToString(),d.Name,d.IP,d.User});返回响应;如您所见,我只是获取数据,选择我想要显示的列(必须与客户端网格中的列相同和顺序),这是尽可能重用的想法。Nico,这是我使用过的用于asp.netwebforms的jqgrid的最佳实现。通过向SerializeQuery方法添加第三个参数,我做了一个小但重要的改进:实际行ID的列表,以便我们可以将它们添加到结果中。如果没有该列表,发送到客户端的行ID实际上只是列表中包含行数据的项目的索引,而不是数据库行中的实际ID。如果您需要在jqgrid中启用编辑和删除,则此选项不可用。publicstringSerializeQuery(IQueryablequery,Func>select,Func>ids){//过滤if(IsSearch&&Where.rules!=null){if(Where.groupOp=="AND")//TODO:INSENSITIVEEQUALS,YunenumGridGroupOperation.And.Name(){foreach(varruleinWhere.rules)query=query.Where(rule.field,rule.data,rule.op);}elseif(Where.groupOp=="OR")//TODO:INSENSITIVEEQUALS,YunenumGridGroupOperation.Or.Name(){vartemp=(newList()).AsQueryable();foreach(varruleinWhere.rules){vart=query.Where(rule.field,rule.data,rule.op);temp=temp.Concat(t);}//删除重复记录query=temp.Distinct();}}//排序query=query.OrderBy(SortColumn,SortOrder);//计数vartotalCount=query.Count();//分页vardata=query.Skip((PageIndex-1)*PageSize).Take(PageSize);//转换为网格格式varresult=new{total=(int)Math.Ceiling((double)totalCount/PageSize),page=PageIndex,records=totalCount,rows=data.Select((d)=>new{id=ids(d),cell=select(d)}).ToArray()};返回JsonConvert.SerializeObject(结果);}这可能是一个更好的选择,records=totalCount,rows=data.Select((d,id)=>new{id,cell=select(d)}).ToArray()};//stuff...}我删除了对接口的需求,并将转换移动到每个特定于网格的查询完成。在这个例子中:[WebMethod][ScriptMethod]publicstringGetData(GridSettingsgrid){varquery=newFakeComputersRepository().Computers();varresponse=grid.SerializeQuery(query,d=>newList{d.ID.ToString(),d.IsOnline.ToString(),d.Name,d.IP,d.User});返回响应;好一点,我猜。还有其他想法可以进一步扩展吗?以上就是C#学习教程的全部内容:jqGridLINQ和匿名类型。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
