2011-01-28 15 views
1

私はちょっと立ち往生しているので、誰かが私を助けてくれることを願っています。Entityフレームワークを使用してLINQ経由で行番号を取得する方法は?

私は、ゲームのヒスコアデータベースの前にサービスを構築しています。アイデアは一度だけ、データベース内の各プレーヤーを持っているし、それらを複数のhiscoreエントリを持って聞かせすることはもちろんである

CREATE TABLE [dbo].[PB_HiscoreEntry] (
    [Id]   UNIQUEIDENTIFIER NOT NULL, 
    [PlayerId] UNIQUEIDENTIFIER NOT NULL, 
    [Score]  INT    NOT NULL, 
    [DateCreated] DATETIME   NOT NULL 
); 


CREATE TABLE [dbo].[PB_Player] (
    [Id]    UNIQUEIDENTIFIER NOT NULL, 
    [UniquePlayerId] NCHAR (32)  NOT NULL, 
    [Name]   NVARCHAR (50) NOT NULL, 
    [DateCreated] DATETIME   NOT NULL 
); 

データベースには、次の2つの表があります。このテーブルのPB_HiscoreEntryには多くのスコアがありますが、単純なOrderByの降順を実行することで、得点の最も高いものが一番下に、一番下が一番低いものを作成することができます。 私の問題は、私のデータベースには、他のスコアと比較してスコアの実際のランクが分からないということです。これは、上記のOrderByクエリを実行するときに行うべきことです。ここで

は、私がアーカイブしたいものをillutrateを助けるためにいくつかのコードです:

var q = (
    from he in entities.PB_HiscoreEntry 
    orderby he.Score descending 
    select new HiscoreItem() 
    { 
     UserId = he.PB_Player.UniquePlayerId, 
     Username = he.PB_Player.Name, 
     Score = he.Score, 
     //Put in the rank, relative to the other entires here 
     Rank = 1 
    }); 

HiscoreItem、私がワイヤ上で送信するために必要なだけの私自身のDTOされます。

誰かが私がこれをどうやってやっているのか、まったく間違っているのですか?

答えて

5

あなたは正しい軌道に乗っています。余分なインデックスを必要とするQueryable.Selectオーバーロードを使用するだけです。私は、Entity Frameworkのは Select<TSource, TResult>(this IQueryable<TSource>, Expression<Func<TSource, int, TResult>>)過負荷で動作する方法を知っている場合は100%わからない

var entries = 
    from entry in entities.PB_HiscoreEntry 
    orderby entry.Score descending 
    select entry; 

// Note the (entry, index) lambda here. 
var hiscores = entries.Select((entry, index) => new HiscoreItem() 
{ 
    UserId = entry.PB_Player.UniquePlayerId, 
    Username = entry.PB_Player.Name, 
    Score = entry.Score, 
    Rank = index + 1 
}); 

:これを見てください。私はこれが役に立てば幸い

// Note the .AsEnumerable() here. 
var hiscores = entries.AsEnumerable() 
    .Select((entry, index) => new HiscoreItem() 
{ 
    UserId = entry.PB_Player.UniquePlayerId, 
    Username = entry.PB_Player.Name, 
    Score = entry.Score, 
    Rank = index + 1 
}); 

:そのような場合、単に静的Enumerableクラスの同等のメソッドを使用します。

+0

私はあなたの最初の提案を試してみましたが、コンパイル時に、今、このエラーが出る:エラーメソッドの型引数のSystem.Linq.Queryable.Select (System.Linq.IQueryable 、System.Linqの.Expressions.Expression >) 'は使用法から推測できません。型引数を明示的に指定してみてください。 –

+0

Oeps!ごめんなさい。あなたは '彼'を 'エントリー'に置き換えるべきです。私の更新された答えを見てください。 – Steven

+0

私はあなたのAsEnumerable()提案を試してみると、私はこのエラーが発生します: "{"このコマンドに関連付けられている開いているDataReaderが既にありますので、最初に閉じなければなりません "}" –

関連する問題