Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何有效地从IQueryable中检索随机元素列表?_C#_Linq_Entity Framework - Fatal编程技术网

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

C# 如何有效地从IQueryable中检索随机元素列表?,c#,linq,entity-framework,C#,Linq,Entity Framework,我看到了以下几点: 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( r

我看到了以下几点:

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() ) );

我现在要做的是——得到三个随机元素——如下所示:

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);
public static IQueryable SelectRandom(此IQueryable列表,整数计数){
返回list.OrderBy(=>Guid.NewGuid()).Take(count);
}    
var结果=用户。选择随机(3);

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

以下方法应该有效:

users.OrderBy(_ => Guid.NewGuid()).Take(3)
这将从users表中检索前3个元素,同时按每次不同的值对它们进行排序


与AD.Net的答案相比。。您需要一个随机生成的用户ID列表。。这并不意味着有什么方法可以做到这一点

有趣。。。你介意解释一下这是如何工作的,以及它与另一个答案的比较吗?@RobVious NewGuid()会生成一个新的随机GUID,因此当你按它排序时,你会得到一个随机排序,并且每次执行该行时都会有所不同。很好!我用扩展方法更新了我的问题。对于100万用户来说,这个表看起来很酷。(我们在这里执行一些SQL)有一个词“高效”,我们正在为每个用户生成GUID,然后对所有字符串进行排序,并从这个漂亮的列表中选取3个。@ValentinKuzub-我的db包含@IanMercer我不是问如何按随机排序,我是问如何选择n随机。