LINQ to SQL 语句(5)之 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  orderbyp.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 =

  .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   orderbyo.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

      wherep2.UnitPrice == g.Max(p3 => p3.UnitPrice)       select p2

   };

 

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