查询实体框架中的第 n 行

本文关键字:实体 框架 查询 | 更新日期: 2023-09-27 18:33:06

我想从每个实体框架的表中查询随机行。

目前我能想到的最佳解决方案是从表中获取总数,然后使每个 C# 成为一个函数来获取计数范围内的随机数,然后查询此随机行号。

我的问题是我无法弄清楚如何直接查询每个实体框架的特定行号。我想防止我需要查询整个表,然后从那里选择行号。

还是我在这里有一个普遍的误解,有一个更简单的方法?

查询实体框架中的第 n 行

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

对于数据库,查询计数的开销要比实际对数千条记录执行 SORT over RANDOM 要少得多。由于 RANDOM 肯定没有索引,因此排序需要很长时间。因此,避免使用第一种方法,使用最好的第二种方法。

这将得到(x+1)第行。如果 x 是基于 0 的,那么如果 x==0,那么它将得到第一行。

Take(n)将指示查询采用 n 行。 Skip(n)将指示查询跳过前 n 行。

多亏了AkashKava很明显,在EF中,您必须在应用Skip之前使用OrderBy。

由于我们不关心特定的顺序,因此我们可以像下面这样排序。

Table.OrderBy(x=>x.id).Skip(1).Take(1)

或者正如AkashKava所指出的那样,您可以使用FirstOrDeafault()

Table.OrderBy(x=>x.id).Skip(1).FirstOrDeafault()