none
使用Linq组合查询技术,如何实现gridview的按照列排序 RRS feed

  • 问题

  •  
     protected void bindgridview()
      {
        IList<PersonnelBasic> persons= new PersonnelBasicBLL().getPersonnelInfoByUnit(45);
        var query = (from p in persons select p).ToList<PersonnelBasic>();
        if (ViewState["SortExpression"] != null)
        {
          string aa = "p." + ViewState["SortExpression"].ToString() + " " + ViewState["SortDirection"].ToString();
          query = (from p in persons
             
               let
                 sort = aa 
               orderby sort
               select p).ToList<PersonnelBasic>();
        }
        GridView1.DataSource = query;
        GridView1.DataBind();
      }
    
    
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
      {
        if (ViewState["SortExpression"] != null && e.SortExpression == ViewState["SortExpression"].ToString())
        {
          if (ViewState["SortDirection"].ToString() == "ascending")
          {
            ViewState["SortDirection"] = "descending";
          }
          else
          {
            ViewState["SortDirection"] = "ascending";
          }
        }
        else
        {
          ViewState["SortExpression"] = e.SortExpression;
          ViewState["SortDirection"] = (e.SortDirection == SortDirection.Ascending) ? "ascending" : "descending";
        }
        bindgridview();
      }
    
    2011年5月3日 2:56

答案

全部回复

  • 刘赛你好,

    我想排序失败是不是因为SortExpression 是数据库表中的字段名称,而"ascending" : "descending" 是关键字而我们将他们当作参数传入的时候是作为字符串的呢?

    比如,我写了个简单的例子:

     var values = new string[] { "12", "4", "7", "18", "32" };
    var q =
     (from s in values
     let i = Convert.ToInt32(s)
     where i > 10
     orderby i
     select s).ToArray();
     
     foreach(var a in q)
     {
     Console.WriteLine(a);
     }

    这个例子就可以运行的很好。

    你可以尝试用动态LINQ以及Lambda表达式来实现你想要的功能, 比如说下面这个排序:

    IQueryable<Customer> custs = db.Customers;
    
    //创建一个参数c
    
    ParameterExpression param =
    
     Expression.Parameter(typeof(Customer), "c");
    
    //c.City=="London"
    
    Expression left = Expression.Property(param,
    
     typeof(Customer).GetProperty("City"));
    
    Expression right = Expression.Constant("London");
    
    Expression filter = Expression.Equal(left, right);
    
    Expression pred = Expression.Lambda(filter, param);
    
    //Where(c=>c.City=="London")
    
    MethodCallExpression whereCallExpression = Expression.Call(
    
     typeof(Queryable), "Where",
    
     new Type[] { typeof(Customer) },
    
     Expression.Constant(custs), pred);
    
    //OrderBy(ContactName => ContactName)
    
    MethodCallExpression orderByCallExpression = Expression.Call(
    
     typeof(Queryable), "OrderBy",
    
     new Type[] { typeof(Customer), typeof(string) }, 
    
     whereCallExpression,
    
     Expression.Lambda(Expression.Property
    
     (param, "ContactName"), param));
    
    //生成动态查询
    
    IQueryable<Customer> query = db.Customers.AsQueryable()
    
     .Provider.CreateQuery<Customer>(orderByCallExpression);

    如果你想要了解更多,请参阅:http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html

    谢谢。


    Jackie Sun [MSFT]
    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手



    2011年5月3日 8:32
    版主
  • 谢谢你的回答,但是可能我和你的理解不同吧 ,我用你上面提供的思路还是没有解决该问题,我发现Iist<>接口有个orderby 的方法,我根据msdn的介绍,但是排序没有反应,不知道这个方法到底该怎么用
    2011年5月4日 8:58
  • 你好,

    谢谢回复。在普通的排序语句中,将"ascending" : "descending" 等关键字作为参数传入是不起作用的,但是使用动态LINQ就可以将关键字当作参数传入语句中。

    请参考下面这个动态LINQ排序的例子:

    http://www.cnblogs.com/jack86514/archive/2009/10/27/1590364.html

    希望对你有帮助。

    谢谢


    Jackie Sun [MSFT]
    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手
    2011年5月5日 2:24
    版主
  • 在order后面加入语句是无效的,因为本身有 order 和 orderdesc两种,默认是asc,你可以用Expression组合动态查询,另外这个查询时放在业务层
    2011年5月7日 3:08