我试图在C#中生成一个LINQ SELECT语句,从特定对象中选择随机项,而不是有序项。如何将以下语法转换为随机选择
random = _dbase.OrderBy(x => x.company).Take(1000);
不能从IEnumerable
中选择随机项,因为它是一个生成值的生成器。它没有大小,所以您可能正在处理一个无限的IEnumerable
,这使得无法选择随机项目。
解决方法是从初始集合中创建一个List<T>
(它有一个大小(,然后选择一个随机项目。
IEnumerable<object> myCollection = ...;
var myList = myCollection.ToList();
var rng = new Random();
var randomIndex = rng.Next(0, myList.Count);
var randomItem = myList[randomIndex];
但在您的情况下,您不希望获取表中的所有数据。相反,您可以在sql请求中进行计算。
这里有一个链接显示如何做到这一点。
偷看以防无效
// DO NOT USE THIS FOR MORE THEN 100 ROWS
var randomRecord = foos.OrderBy( x=> SqlFunctions.Rand() ).FirstOrDefault();
// USE THIS FOR MORE THEN 100 ROWS
var random = Math.Random(foos.Count());
var randomRecord = foos.OrderBy( x=> x.id ).Skip( random ).FirstOrDefault();