【发布时间】:2014-07-13 12:09:30
【问题描述】:
我看过以下内容:
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() 在这里可能很昂贵。
【问题讨论】:
-
@IanMercer 我不是在问如何随机订购,而是在问如何随机选择 n 个。
标签: c# linq entity-framework