3

Entity Framework ごとにテーブルからランダムな行をクエリしたい。

現時点で考えられる最善の解決策は、テーブルから合計カウントを取得し、C# ごとにカウントの範囲内の乱数を取得する関数を作成し、このランダムな行番号をクエリすることです。

私の問題は、Entity Framework ごとに特定の行番号を直接クエリする方法がわからないことです。テーブル全体をクエリしてから、そこから行番号を選択する必要がないようにしたい。

それとも、ここで一般的な誤解があり、もっと簡単な方法がありますか?

4

2 に答える 2

6
// 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 は確かにインデックス化されていないため、ソートに非常に時間がかかります。したがって、最初の方法の使用を避け、最適な 2 番目の方法を使用してください。

于 2013-09-27T13:16:37.650 に答える
3

これにより、(x+1) 番目の行が取得されます。x が 0 ベースの場合、x==0 の場合は 1 行目を取得します。

Take(n)n行を取るようにクエリを指示します。 Skip(n)最初の n 行をスキップするようにクエリを指示します。

EF では、Skip を適用する前にOrderByAkashKavaを使用する必要があることは明らかです。

特定の順序は気にしないので、次のように並べ替えることができます。

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

AkashKavaまたはあなたが指摘したようにFirstOrDeafault()

Table.OrderBy(x=>x.id).Skip(1).FirstOrDeafault()
于 2013-09-27T12:53:34.620 に答える