我见过以下内容:
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()
可能是这里很贵。
答案 0 :(得分:2)
以下内容应该有效:
users.OrderBy(_ => Guid.NewGuid()).Take(3)
这将检索users表中的前3个元素,同时按每次不同的值对它们进行排序。
与AD.Net的答案相比......你需要一个随机生成的用户ID列表......它没有建议的方法