1. 程式人生 > >Linq排序方式與Lambda排序方式比較以及OrderBy、ThenBy的使用

Linq排序方式與Lambda排序方式比較以及OrderBy、ThenBy的使用

輸出結果 使用 var .cn ges http color new linq

沿用之前某一篇文章的實體類與EF操作類代碼。數據庫中增加幾條數據

技術分享

Linq 的排序方式,下面例子是根據RoleId 升序,Name降序

EFContext<Member> efMemberContext = new EFContext<Member>();
var memberSet = efMemberContext.Set<Member>().Include("Role");
var memberList = from m in memberSet
                 orderby m.RoleId ascending, m.Name descending
                 
select m; foreach (Member item in memberList) { Console.WriteLine("{0},Role:{1}",item.Name,item.Role.Name); }

輸出結果如下:

技術分享

SQL Profiler如下:

技術分享

同樣的方式如果用Lambda排序,先猜想如下,

EFContext<Member> efMemberContext = new EFContext<Member>();
var memberSet = efMemberContext.Set<Member>().Include("
Role"); var memberList = memberSet.OrderBy(m => m.RoleId).OrderByDescending(m => m.Name); foreach (Member item in memberList) { Console.WriteLine("{0},Role:{1}",item.Name,item.Role.Name); }

運行程序發現與linq方式的不一致,

技術分享

SQL Profile如下:

技術分享

發現連續調用OrderBy或者OrderByDescending之後,以最後一個為準排序,這時ThenBy就派上了用場。

ThenBy是使用OrderBy或者OrderByDescending之後,再次對結果進行二次排序

EFContext<Member> efMemberContext = new EFContext<Member>();
var memberSet = efMemberContext.Set<Member>().Include("Role");
var memberList = memberSet.OrderBy(m => m.RoleId).ThenByDescending(m => m.Name);
foreach (Member item in memberList)
{
    Console.WriteLine("{0},Role:{1}",item.Name,item.Role.Name);
}

技術分享

技術分享

如果想數據庫中多個列排序一致,可以先OrderBy(或者OrderByDescending)後ThenBy(或者ThenByDescending),也可以在OrderBy或者OrderByDescending直接指定多個屬性,這樣生成的SQL就是多個列的排序(排序一致asc/desc)

EFContext<Member> efMemberContext = new EFContext<Member>();
var memberSet = efMemberContext.Set<Member>().Include("Role");
var memberList = memberSet.OrderBy(m => new { m.RoleId, m.Name });
foreach (Member item in memberList)
{
    Console.WriteLine("{0},Role:{1}",item.Name,item.Role.Name);
}

技術分享

技術分享

Linq排序方式與Lambda排序方式比較以及OrderBy、ThenBy的使用