LINQ之Order By

系统 1803 0

LINQ之Order By

Order By操作

适用场景 :对查询出的语句进行排序,比如按时间排序等等。

说明 :按指定表达式对集合排序;延迟,:按指定表达式对集合排序;延迟,默认是升序,加上descending表示降序,对应的扩展方法是OrderBy和OrderByDescending

1.简单形式

这个例子使用 orderby 按雇用日期对雇员进行排序:

      
        var 
      
      q = 
      
        from 
      
      e 
      
        in 
      
      db.Employees 
      
        orderby 
      
      e.HireDate 
      
        select 
      
      e;
    

说明:默认为升序

2.带条件形式

注意:Where和Order By的顺序并不重要。而在T-SQL中,Where和Order By有严格的位置限制。

      
        var 
      
      q = 
      
        from 
      
      o 
      
        in 
      
      db.Orders 
      
        where 
      
      o.ShipCity == 
      
        "London" 
      
      
        orderby 
      
      o.Freight 
      
        select 
      
      o;
    

语句描述:使用where和orderby按运费进行排序。

3.降序排序

      
        var 
      
      q = 
      
        from 
      
      p 
      
        in 
      
      db.Products 
      
        orderby 
      
      p.UnitPrice 
      
        descending select 
      
      p;
    

4.ThenBy

语句描述:使用复合的 orderby 对客户进行排序,进行排序:

      
        var 
      
      q = 
      
        from 
      
      c 
      
        in 
      
      db.Customers 
      
        orderby 
      
      c.City, c.ContactName 
      
        select 
      
      c;
    

说明:按多个表达式进行排序,例如先按City排序,当City相同时,按ContactName排序。这一句用Lambda表达式像这样写:

      
        var
      
       q = db.Customers .OrderBy(c => c.City) .ThenBy(c => c.ContactName).ToList();
    

在T-SQL中没有ThenBy语句,其依然翻译为OrderBy,所以也可以用下面语句来表达:

      
        var 
      
      q = db.Customers .OrderBy(c => c.ContactName) .OrderBy(c => c.City).ToList();
    

所要注意的是,多个OrderBy操作时,级连方式是按逆序。对于降序的,用相应的降序操作符替换即可。

      
        var 
      
      q = db.Customers .OrderByDescending(c => c.City) .ThenByDescending(c => c.ContactName).ToList();
    

需要说明的是,OrderBy操作,不支持按type排序,也不支持匿名类。比如

      
        var 
      
      q = db.Customers .OrderBy(c => 
      
        new 
      
      { c.City, c.ContactName }).ToList();
    

会被抛出异常。错误是前面的操作有匿名类,再跟OrderBy时,比较的是类别。比如

      
        var 
      
      q = db.Customers .Select(c => 
      
        new     
      
      { c.City, c.Address }) .OrderBy(c => c).ToList();
    

如果你想使用OrderBy(c => c),其前提条件是,前面步骤中,所产生的对象的类别必须为C#语言的基本类型。比如下句,这里City为string类型。

      
        var 
      
      q = db.Customers .Select(c => c.City) .OrderBy(c => c).ToList();
    

5.ThenByDescending

这两个扩展方式都是用在OrderBy/OrderByDescending之后的,第一个ThenBy/ThenByDescending扩展方法作为第二位排序依据,第二个ThenBy/ThenByDescending则作为第三位排序依据,以此类推

      
        var 
      
      q = 
      
        from 
      
      o 
      
        in 
      
      db.Orders 
      
        where 
      
      o.EmployeeID == 1 
      
        orderby 
      
      o.ShipCountry, o.Freight 
      
        descending select 
      
      o;
    

语句描述:使用orderby先按发往国家再按运费从高到低的顺序对 EmployeeID 1 的订单进行排序。

6.带GroupBy形式

      
        var
      
       q = 
      
        from 
      
      p 
      
        in 
      
      db.Products 
      
        group 
      
      p 
      
        by 
      
      p.CategoryID
      
         into 
      
      g 
      
        orderby 
      
      g.Key 
      
        select new 
      
      { g.Key, MostExpensiveProducts = 
      
        from 
      
      p2 
      
        in 
      
      g 
      
        where 
      
      p2.UnitPrice == g.Max(p3 => p3.UnitPrice) 
      
        select 
      
      p2 };
    

语句描述:使用orderby、Max 和 Group By 得出每种类别中单价最高的产品,并按 CategoryID 对这组产品进行排序。

 

LINQ之Order By


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论