Linq排序方式与Lambda排序方式比较以及OrderBy、ThenBy的使用

本文对比了Linq排序方式与Lambda排序方式,沿用之前文章的实体类与EF操作类代码,给出了Linq按RoleId升序、Name降序排序的例子。还指出Lambda连续调用OrderBy等以最后一个为准,介绍了ThenBy可进行二次排序,以及实现多列排序的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linq排序方式与Lambda排序方式比较以及OrderBy、ThenBy的使用

沿用之前某一篇文章的实体类与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);
}

复制代码

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值