从没有OrderBy的Entity Framework数据库中挑选随机记录
本文关键字:数据库 挑选 随机 记录 Framework Entity OrderBy | 更新日期: 2023-09-27 18:21:53
我尝试从数据库中获取随机记录:
personToCall = db.Persons.Skip(toSkip).Take(1).First();
但我得到了一个例外,告诉我:
{"The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'."}
没有OrderBy
我能做吗?对数据结构(O(nlogn))进行排序以选择随机元素(应该是常量)看起来并不明智。
编辑:我使用实体框架6.1.1。
您可以拥有以下内容:
personToCall = db.Persons.OrderBy(r => Guid.NewGuid()).Skip(toSkip).Take(1).First();
您应该使用FirstOrDefault
作为模式防御。
黑暗领主在这里教尤达力量!世界要变成什么样子了!
首先,您需要获得从1到最大记录的随机数,请参阅此
Random rand = new Random();
int toSkip = rand.Next(0, db.Persons.Count());
db.Persons.Skip(toSkip).Take(1).First();
根据订单,您可以使用Guid.NewGuid()
db.Persons.OrderBy(x=>x.Guid.NewGuid()).Skip(toSkip).Take(1).FirstOrDefault();
没有排序子句是无法做到这一点的
personToCall=数据库。Persons.OrderBy(r=>Random.Next()).First();
根据Persons表的大小,这可能会很慢,所以如果你想让它变快,你必须向Person添加一列,或者将其加入随机数和Person键的字典,然后按此排序。但这很少是一个明智的解决方案。
最好就手头的整体任务提出更高层次的问题。
要避免OrderBy,请转储到List并根据Index:进行随机选择
VB
With New List(Of Persons)
.AddRange(db.Persons)
PersonToCall = .Item(New Random().Next(0, .Count - 1))
End With
C#
var people = new List<Persons>();
people.AddRange(db.Persons);
personToCall = people.Item(new Random().Next(0, people.Count - 1));