只是想知道使用实体框架访问 SQL Server 中的随机条目的一些性能问题。
我发现很多地方推荐的通用解决方案是使用
db.Table.OrderBy(x => Guid.NewGuid()).FirstOrDefault()
我想知道的是,使用它是否会更有效
var skip = random.Next(0, db.Table.Count());
db.Table.OrderBy(x => x.Id).Skip(skip).FirstOrDefault()
因为第一个替代方案依赖于随机地对表中的每个条目重新排序(除非 SQL Server 对此有一些特殊的优化?),而第二个替代方案应该检索项目的数量(我相信它会在恒定的时间内运行),然后只检索单一元素。
Entity Framework Core 6+ 新增了一个功能:
EF.Functions.Random()
db.Table.OrderBy(x => EF.Functions.Random()).FirstOrDefault()
这种方法的优点是它使用了数据库引擎的内部功能,并且已经为大多数数据库实现了。
参见https://github.com/dotnet/efcore/issues/16141#issuecomment-666641607