0

これは以前に何度も尋ねられましたが、これに対する決定的な答えを見つけることができませんでした。誰でも手伝ってもらえますか

X 個の行を取得するために、nhibernate を使用してデータベース (sqlServer と mysql) にクエリを実行できるようにしたいと考えています。これらの番号は一意である必要があります。350 の中から 250 を選択しているので、重複する可能性が高いです (ランダムではないということは一意であることを意味するため)。

これは、mysql と sql サーバーの両方で機能する必要があります。

私はすでにテーブルの 70% 以上を選択しているので、すべてのレコードを選択し、LINQ を使用して 250 の一意の値を引き出すことを気にしません (これが可能であれば)。

システムのオーバーヘッドへの影響が最も少ないものは何でも。

ありがとう!

4

3 に答える 3

0

RAND() または NEWID() を使用して結果を並べ替え、上位 250 を選択できます。結果は個別かつランダムになります。効率の点では、これは 350 の結果すべてを取得してコードでランダムに並べ替えるよりも効率的です。キャッシングを無視した場合

ただし、結果をキャッシュする場合は、350 の結果をキャッシュに取得し (できれば NHibernate の第 2 レベルのキャッシュを使用して)、次のようなコードを使用してコードで並べ替える方が、時間の経過とともに大幅に効率的になります。

var rand = new Random();    
var results = Session.CreateCriteria<MyClass>()
   .SetCacheable(true)
   .List()
   .OrderBy(x => rand.Next());
于 2012-05-21T13:34:03.773 に答える
0

.ToList();の前に.Distinct()を追加してください。

于 2012-05-21T09:45:18.980 に答える
0

あなたは自分自身に答えたと思います。

350 レコードのフルテーブル クエリは、250 レコードの複雑なランダム化およびページング クエリよりもサーバーへの負担が少なくなります (これは通常、内部クエリの行に uniqueidentifier を追加し、それを使用して並べ替えることによって行われます。 LINQでそれを行います)

結果をキャッシュし、毎回メモリ内のリストをランダム化して、250 の異なるレコードを取得することもできます。

于 2012-05-21T13:07:33.327 に答える