从没有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。

从没有OrderBy的Entity Framework数据库中挑选随机记录

您可以拥有以下内容:

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