天天看点

详解关于 C# 中 Linq 随机排序的有效解决方法

在做数据操作的时候,随机排序难免都会遇到。而如果使用 Linq 进行数据操作的话,你会发现 Linq 并没有提供随机排序的方法。而百度一下“Linq 随机排序”可以找到N多的方法,要非常简单的也有,要非常复杂也有,但是,这些方法里也有N多是行不通的,也有看到一篇博文,列出了五六种方法,然后在最后一一都注明了无效,行不通。

那么,到底在 Linq 中我们怎么实现对数据库查询出来的结果,进行随机排序呢?先不说废话,上代码:

var shops = db.Shops.ToList().OrderBy(i => Guid.NewGuid()).ToList();
this.dgvShops.DataSource = shops;           

代码简单明了,就是把一个 Shops 表里面的数据查询出来之后,随机排序,然后绑定到一个 DataGridView 中。是否觉得很熟悉?在网上一查一大堆告诉你用 Guid.NewGuid() 去排序的。但是,是否也觉得很奇怪?为什么有两次 ToList()?

这里需要说明一下,OrderBy(i => Guid.NewGuid()) 可以对一个实体列表进行随机排序,但不能对数据库中的表直接随机排序(其它排序是可以的),所以第一个 ToList() 我们是要让 Linq 去执行编译后的 SQL 语句,并得到一个 List<Shop> 类型的实体列表。然后再 OrderBy() 随机排序,但 OrderBy 之后又是一个泛型,所以我们还得再 ToList() 一次,好让它直接绑定到 DataGridView 上。

这里可能绕得有点乱,但最想说明的就是 ToList() 要放在 OrderBy(i => Guid.NewGuid()) 之前,就可以实现随机排序,而不用绕远路去自己写排序方法。

最后,这两行代码纯粹是实验性的 DEMO 代码,实际应用中可以根据不同需要,和有所改变,不一定要和我这样两个 ToList() 哈。