我想从每个实体框架的表中查询一个随机行。
目前我能想到的最佳解决方案是从表中获取总计数,然后为每个 C# 创建一个函数以获取计数范围内的随机数,然后查询该随机行号。
我的问题是我无法弄清楚如何直接查询每个实体框架的某个行号。我想防止我需要查询整个表,然后从那里选择行号。
还是我在这里有一个普遍的误解并且有更简单的方法?
我想从每个实体框架的表中查询一个随机行。
目前我能想到的最佳解决方案是从表中获取总计数,然后为每个 C# 创建一个函数以获取计数范围内的随机数,然后查询该随机行号。
我的问题是我无法弄清楚如何直接查询每个实体框架的某个行号。我想防止我需要查询整个表,然后从那里选择行号。
还是我在这里有一个普遍的误解并且有更简单的方法?
// 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()