如何有效地从IQueryable中检索随机元素列表?

时间:2014-05-24 03:16:10

标签: c# linq entity-framework

我见过以下内容:

Random element of List<T> from LINQ SQL

我现在所做的 - 获得三个随机元素 - 如下:

var user1 = users.ElementAt( rand.Next( users.Count() ) );
var user2 = users.Where(u => !u.Equals(user1)).ElementAt( rand.Next( users.Count() ) );
var user3 = users.Where(u => !u.Equals(user1) && !u.Equals(user2)).ElementAt( rand.Next( users.Count() ) );

但这显然是不合时宜且效率低下的。如何一次访问数据库,如何才能优雅高效地完成这项工作?

编辑:根据以下答案,我做了以下扩展方法:

    public static IQueryable<T> SelectRandom<T>(this IQueryable<T> list, int count) {
        return list.OrderBy(_ => Guid.NewGuid()).Take(count);
    }    

    var result = users.SelectRandom(3);

但是对于大型数据集来说,这似乎效率低下。另一个建议是采用IQueryable的.Count(),选择属于该结果的n个随机数,然后用选定的随机索引向db发送查询......但Count()可能是这里很贵。

1 个答案:

答案 0 :(得分:2)

以下内容应该有效:

users.OrderBy(_ => Guid.NewGuid()).Take(3)

这将检索users表中的前3个元素,同时按每次不同的值对它们进行排序。

与AD.Net的答案相比......你需要一个随机生成的用户ID列表......它没有建议的方法