2009-08-12 7 views
1

より大きい写真タイプのオブジェクトと特定の順序でソートされた結果セットがある場合、結果に現在の写真オブジェクトの位置を取得する方法がありますセット。それに続くすべてのオブジェクトを取得しますか?LINQ-To-SQLの行番号が

+0

また、先行するオブジェクトをどのように取得しますか?私はSQLからコレクション全体を取得することなくこれを実行しようとしています – maxfridbe

+0

あなたはすべての写真を持っているメモリ内の結果セットを持っていますか、データベースに戻って単一の次/前の写真を取得しますか? ? –

+0

私は、Row_Numberのようなエンティティが存在することを望んでいました。このオブジェクトの位置よりも大きくなる可能性があります。 – maxfridbe

答えて

1

あなたは同上に対してソートしている場合:

// gets the previous photo, or null if none: 
var previousPhoto = db.Photos 
    .Where(p => p.Id < currentPhotoId) 
    .OrderByDescending(p => p.Id) 
    .FirstOrDefault(); 

// gets the next photo, or null if none: 
var nextPhoto = db.Photos 
    .Where(p => p.Id > currentPhotoId) 
    .OrderBy(p => p.Id) 
    .FirstOrDefault(); 

カスタムオーダーを持っている場合は、 OrderBy/OrderByDescendingの式をカスタム注文に置き換える必要があります。また、現在の写真の前後にある写真のみを取得するには、Where()に同じ注文基準を使用する必要があります。これはあなたの元のコレクションでの指標と組み合わせるphotoを、以下のすべての写真を与えるだろう

var result = 
    photos.Select((p, i) => new { Index = i, Photo = p }) 
    .SkipWhile(x => x.Photo != photo).Skip(1); 

0

ない私が正しく理解しますが、これは役立つ可能性がある場合を確認します。実際には

var result = photos.Skip(100); // 100 would be the position of current object. 

// if you don't know the index of the current object: 
// This won't work on LINQ to SQL directly, do it on a list or something. 
var result = photos.SkipWhile(x => x != currentObject).Skip(1); 

を使用すると、データベースを扱っている場合は、あなたがすることによってソートされているいくつかの識別子(列の集合)があるはずです。サーバー側ですべてを実行したい場合は、現在のオブジェクトのプロパティを取得し、必要な並べ替え順序で後続するオブジェクト用の結果セットをフィルタリングすることができます。写真の

+0

どのように私は現在のオブジェクトの位置を取得しますか。 – maxfridbe

0

インデックス:それは後に

result.IndexOf(photo); 

アイテム:

result.SkipWhile((q, i) => i <= result.IndexOf(photo)); 
+0

私はその結果が既に彼によってソートされていて、データベースからの注文ではないと仮定しています。 –

2

あなたはこのような何か(ひどく効率的ではない)を行うことができます。

+0

SkipWhileにはインデックス付きオーバーロードが含まれています。 –

+0

はい、そのオーバーロードは、インデックスを使用してスキップするものを決定する場合にのみ便利です。 'SkipWhile'と' Skip'の両方に元のインデックスを残したいと思います。 –