• 【转】Linq之动态排序(字符传入)


     最近做的是一个MVC的项目,至于MVC是个啥东西,群里已经有很多朋友讲过,这里不再多讲了,本文的前提是在MVC项目的View中显示Table,对Table进行SortingPaging,我都知道View中要实现SortingPaging一定要有自己的Action进行响应,如果要实现SortingPaging,那么我们只能把参数传给Action,但是Action接收SortingPaging的参数,如何使用Linq实现SortingPaging呢?哎,终于说到和主题有关的了,而且还是以字符传参的方式在Linq中进行Sorting有点难实现,这就是我写这篇文章的目的。此文只是本人实现Linq的方法,如果高手路过请指点斧正,下面就来谈一谈。

    .本文内容

    1. Linq中Paging的实现

    2. Linq中动态排序的实现

    3. 本文总结

    4. 代码下载(下载

    .Linq Paging的实现

      其实Paging已经有很多人讲过了,其文章已经是数不尽数了,其语句相对简单,如下:

      DatabaseDataContext db = new DatabaseDataContext();
      var result = from s in db.T_BC_PRODUCTs select s;
      return result .Skip(pageNumber * pageSize).Take(pageSize);

      以上的代码就实现了Paging的功能。好,Paging我们就说到这里,相信大家都能明白。

    四.Linq Sorting动态排序的实现(根据字符参数)

    在Linq排序有很多方法,网络上关于静态排序和部分动态排序的文章,而静态排序相对来说比较简单,也比较容易实现,这里我就不提了,有需要的朋友可以到网上去搜索,相信一大堆。哈哈!至于动态排序网上也有部分例子,但是我一个也没有试成功,呵呵!可能我还没有理解,所以迫于无耐就自己写了个,还请望高手斧正。

    这里我们只说如何实现字符参数作为Linq Sorting的条件。

    下面是实例步骤:

    1.    创建一个页面,加入一个Button,用来实现排序,实现如下代码Button1_Click所示。

     

     1 using System;
     2 using System.Collections;
     3 using System.Configuration;
     4 using System.Data;
     5 using System.Linq;
     6 using System.Web;
     7 using System.Web.Security;
     8 using System.Web.UI;
     9 using System.Web.UI.HtmlControls;
    10 using System.Web.UI.WebControls;
    11 using System.Web.UI.WebControls.WebParts;
    12 using System.Xml.Linq;
    13 using System.Collections.Generic;
    14 using System.Reflection;
    15 using System.Linq.Expressions;
    16 
    17 namespace LinqTest
    18 {
    19     public partial class _Default : System.Web.UI.Page
    20     {
    21         protected void Page_Load(object sender, EventArgs e)
    22         {
    23 
    24         }
    25 
    26         protected void Button1_Click(object sender, EventArgs e)
    27         {
    28             GridView1.DataSource = GetSchoolList("ID","desc",0,0);
    29             GridView1.DataBind();
    30         }
    31 
    32         public IQueryable<T_BC_PRODUCT> GetSchoolList(string sortExpr, string sortDir, long pageNumber, int pageSize)
    33         {
    34             DatabaseDataContext db = new DatabaseDataContext();
    35             var result = from s in db.T_BC_PRODUCTs select s;
    36             IQueryable<T_BC_PRODUCT> query = DBHelper.SortingAndPaging<T_BC_PRODUCT>(result, sortExpr, sortDir,2,3);
    37             return query;
    38         }
    39     }
    40 }

    2.     在Button事件中,我们提供了字符参数“ID”,这是告诉我们按ID字段进行排序,那我们把ID是选择升序还是降序排列呢,这时就看后面的参数,我们这里提供的是desc。OK,到这里我们提供了字符参数和按什么样的顺序进行排列,当然这里也可以根据你的需求而传递不同的字段或asc排列方式(在我的MVC进行中,这些参数是以参数的形式传给Controller的,然后再传递这些参数进行排序),这里只是用aspx.cs文件做示例。

    3. Button事件把参数传给GetSchoolList,下面我们来分析这个方法。

     这个方法其实就是我们在实现应用的时候要使用的方法,他会告诉我们应该返回什么样的数据类型,并且把从DB查询的结果以及排序和分布的参数一起传给 DBHelper.SortingAndPaging<T_BC_PRODUCT>(result, sortExpr, sortDir,2,3);这个方法。这个方法就是我们实现排序和分页的主要方法。

     这里要注意的是我们传递T_BC_PRODUCT类型,这表示,我们的排序的字段是在些类型之中的,并且就返回此种类型的结果。SortingAndPaging方法的实现如下所示:

     1 #region Copyright(C) 2009 Xiong Wei All rights reserved.
     2 // ==============================================================================
     3 // Copyright(C) 2009 Xiong Wei
     4 //
     5 // SYSTEM NAME          : 
     6 // COMPONENT ID         : LinqTest.DBHelper
     7 // COMPONENT DESC       : 
     8 //
     9 // CREATED DATE/BY     : 2009 / Xiong Wei
    10 //
    11 // REVISION HISTORY     :
    12 // DATE/BY ISSUE#/SR#/CS/PM#/OTHERS    DESCRIPTION OF CHANGE
    13 // 
    14 // 
    15 // ==============================================================================
    16 
    17 #endregion
    18 using System;
    19 using System.Data;
    20 using System.Configuration;
    21 using System.Linq;
    22 using System.Web;
    23 using System.Web.Security;
    24 using System.Web.UI;
    25 using System.Web.UI.HtmlControls;
    26 using System.Web.UI.WebControls;
    27 using System.Web.UI.WebControls.WebParts;
    28 using System.Xml.Linq;
    29 using System.Reflection;
    30 using System.Linq.Expressions;
    31 
    32 namespace LinqTest
    33 {
    34     public static class DBHelper
    35 
    36     {
    37         public static IQueryable<T> DataSorting<T>(IQueryable<T> source, string sortExpression, string sortDirection)
    38         {
    39             string sortingDir = string.Empty;
    40             if (sortDirection.ToUpper().Trim() == "ASC")
    41                 sortingDir = "OrderBy";
    42             else if (sortDirection.ToUpper().Trim() == "DESC")
    43                 sortingDir = "OrderByDescending";
    44             ParameterExpression param = Expression.Parameter(typeof(T), sortExpression);
    45             PropertyInfo pi = typeof(T).GetProperty(sortExpression);
    46             Type[] types = new Type[2];
    47             types[0= typeof(T);
    48             types[1= pi.PropertyType;
    49             Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param));
    50             IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);
    51             return query;
    52         }
    53 
    54         public static IQueryable<T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize)
    55         {
    56             return source.Skip(pageNumber * pageSize).Take(pageSize);
    57         }
    58 
    59         public static IQueryable<T> SortingAndPaging<T>(IQueryable<T> source, string sortExpression, string sortDirection, int pageNumber, int pageSize)
    60         {
    61             IQueryable<T> query = DataSorting<T>(source, sortExpression, sortDirection);
    62             return DataPaging(query, pageNumber, pageSize);
    63         }
    64     }
    65 
    66 }

      我们对Sorting的代码分析如下:

      ParameterExpression param = Expression.Parameter(typeof(T), sortExpression);

      我们们传入的类型中找出我们需要进行排序的字段。
      PropertyInfo pi = typeof(T).GetProperty(sortExpression);

      取出要排序字段的相关属性

      Type[] types = new Type[2];
      types[0= typeof
    (T); 获得要进行排序的数据集的类型。
      types[1= pi.PropertyType;  取出我们把什么类型的字段进行排序(即传入参数的值类型)

      Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param));

      生成排序表达式
      IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr); 

      执行排序

     .本文总结

       通过我们应该了解如下知识:

    1. Linq中Paging的使用。

    2. Linq中Sorting的使用,本文只说明自己对sorting的实现,只作为参考,希望对你的应用有所帮助。

    3. 其中有部分反射的内容,需要理解。

    业精于勤荒于嬉 行成于思毁于随
  • 相关阅读:
    Linux命令:cp (copy)复制文件或目录
    使用 robots.txt 文件阻止或删除网页说明
    ecshop优化修改sitemap.xml到根目录
    我虚拟机上装的CentOS系统显示的ip配置是127.0.0.1,请问如何解决?
    Servlet/JSP vs. ASP.NET MVC
    Ubuntu Linux 上安装Apache的过程
    Ubuntu Linux 上安装Eclipse的过程
    sudo的意义
    Dependency Injection
    Ubuntu Linux 上安装TomCat的过程
  • 原文地址:https://www.cnblogs.com/mistor/p/2708340.html
Copyright © 2020-2023  润新知