0

無限スクロールの Web ページがあります。このスクロールにランダムなレコードを供給しています (そのために使用order by newid()しています)。スクロールが最後に達したときに、ページに新しいランダム データを追加する ajax 呼び出しがあります。明らかに、このアプローチでは重複したレコードを取得しています。ここに私の質問があります: レコードの重複を避ける方法はありますか? すでにページにロードされているレコードをどこかに保存して、選択から除外する必要がありますか? または、ランダムなレコードを含む巨大なレコードセットを選択し、それをメモリに保持してから、このレコードセットのチャンクをページにフィードする必要がありますか? ランダムな無限スクロールを行う正しい方法は何ですか? 前もって感謝します!

編集

要求されたコード:

データ提供者:

res = data.OrderBy(l => Guid.NewGuid()).Take(numberOfRecords);

クライアント:

$.get("/Start/Index/", function (data) {
                if (data != '') {                        
                    isLoading = false;
                    $("#tiles").append(data);});

サーバ:

model.PageData = _dataProvider.GetOnePage(recordsPerPage);
return PartialView("_MyView", model.PageData);
4

2 に答える 2

0

私が理解しているように、 newid を使用すると、大きなテーブルでは高速ではありません.SqlServerは、注文する前にテーブルの各行にランダムな値を割り当てる必要があります. この MSDN の記事には小さな議論があります: http://msdn.microsoft.com/en-us/library/cc441928.aspx

クエリを実行するたびに「同じランダムな結果」を得るには、順序を計算して保存するか、保存するシードに基づいて予測可能にする必要があります。

次のようなことを試してみてください:

  SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM(*)) as int)) % 100) < 10

BINARY_CHECKSUM 関数のプロパティは、変更されていない行で使用されるたびに、同じチェックサム番号を返すことです。したがって、それを単独で使用すると、その後のクエリの実行で、同じ「ランダムな」行セットが返されます。通常、これは望ましくありませんが、目的によっては望ましい場合があります。異なるユーザーに対してよりランダムにするために、RAND(?) で BINARY_CHECKSUM(*) を複数回使用し、そのユーザー セッション用に保存したシードを渡すことができます。BINARY_CHECKSUM で使用される列を、ID や created_at タイムスタンプなど、変更されない予測可能なものに制限し、 where id > を追加することもできます。

すべてをまとめると、クエリは次のようになります。

  SELECT * FROM Table1
  WHERE id > ? AND (ABS(CAST(
  (BINARY_CHECKSUM(*) * RAND(?)) as int)) % 100) < 10

そして、無限スクロールを最初に表示したときの最大 ID と、そのときに生成したシードの 2 つのパラメーターを渡します。

残念ながら、私はこれを試すことができませんでした - うまくいくかどうか教えてください.

于 2013-03-05T20:36:55.187 に答える
0

2 日間の調査の後、レコードを重複させずにランダムな無限スクロールを行う簡単な方法がないことがわかりました。ランダムスクロールができない場合は、ランダムに見えるが実際にはそうではないスクロールを行う必要があると判断しました。それで、この解決策になりました:

data = data.OrderByDescending(link => EntityFunctions.TruncateTime(link.link_timestamp)).OrderBy(l => l.link_randomid).Skip(skip).Take(numberOfRecords);

ここで、link_randomid は、レコードの挿入時に生成された一意のランダム ID です。これが誰かのために時間を節約することを願っています。

于 2013-03-06T17:02:38.080 に答える