2009-04-05 17 views
3

と私は自分のデータベースを照会するには、次のコードを使用しています:重複行ORDERBYを使用した場合、(スキップ)と(テイク)LINQ

private const int PAGE_SIZE = 10; 

public static IList<Image> GetTopImagesForUser(String connectionString, int userID, int page) 
{ 
    dbDataContext db = new dbDataContext(connectionString); 
    var images = (from p in db.Images 
        where (p.SubmitterUserIndex == userID && 
         p.URL != "none" && 
         p.ThumbURL != "none") 
        orderby p.Rep descending 
        select p).Skip(page * PAGE_SIZE).Take(PAGE_SIZE); 
    /* snip */ 
    return topImages; 
} 

私は0のページでこのコードを呼び出すと、私はそれが望むようにすべての作品 - 私はきれいに順序リスト、10結果、すべてが正しいです。

ページでこのコードを呼び出すと、ページ0の行は1ページ目になります。理由を理解することさえできません。私は重複行のために自分のデータベースをチェックしました。私はすべての行のURLThumbURLが "none"でないことを確認しました。それも問題ではない。私はこのメソッドを呼び出すときに、ページが私が期待しているものであることを確認しました。それはいつも私が期待するものです。本当に私をバッフル何

は期待通りに完全に動作しますORDERBY句、第1の方法とは異なり、以下の方法で、ということです。

public static IList<Image> GetAllImagesForUser(String connectionString, int userID, int page) 
{ 
    dbDataContext db = new dbDataContext(connectionString); 
    var images = (from p in db.Images 
        where (p.SubmitterUserIndex == userID && 
         p.URL != "none" && 
         p.ThumbURL != "none") 
        orderby p.SubmitTime descending 
        select p).Skip(page * PAGE_SIZE).Take(PAGE_SIZE); 
    /* snip */ 
    return allImages; 
} 

誰もこのようなものに遭遇しましたか?私の質問が私がしたいことをするために取るべき別のフォームがありますか?私は何が欠けているのかわからない。

+0

これは良い質問です。最初にこの問題に遭遇したとき、それはちょっと心配です。 – DOK

+0

それは心配だった!それは今でもずっと意味をなさない!ありがとう:-) –

答えて

8

「重複行」がないと言うとき、返される行のRep値は同じですか?そうであれば、それ内の順序は不確定になります。

より予測可能な結果を​​得るために

orderby p.Rep descending, p.SubmitTime 

(または完全に決定される他のいくつかの順序)を試してみてください。

また、このLINQ to SQLはありますか?その場合は、生成されたSQLを見て、何が起きているのかを確認する必要があります。

+0

それはまさにそれでした。 SubmitTimeを含むトリックでした。うわー、私は決してそれを推測したことはありませんでしたが、今私が考えているように、私の元のコードがうまくいかなかったのは理にかなっています。ありがとう! –

1

最初のケースでソートする列には重複が含まれている可能性があります。値100の行を含むリストから上位10を選択すると、返される行は保証されません。一意の列を含めるようにorder by句を変更します。

2

私はLINQを使用していないときにページングの同様の問題に悩まされていますが、SELECTクエリ(sprocで)を使用しています。私は問題がRepフィールドが一意ではないかもしれないと思うが、SubmitTimeフィールドは日付であり、一意であるかもしれない。

Repの後に2番目のフィールドを入力すると、Order Byが常に同じ順序で結果を返すようにすることをお勧めします。これは、レコードを一意にする任意のフィールドにすることができます。あなたは結果にそれを使用する必要はありません。

関連する問題