Как получить номер строки через LINQ, используя Entity Framework? - PullRequest
1 голос
/ 28 января 2011

Надеюсь, кто-нибудь может мне помочь, потому что я немного застрял.

Я создаю сервис перед базой данных его игры.

База данных имеет следующие две таблицы:

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
);

Идея, конечно, состоит в том, чтобы каждый игрок только один раз попадал в базу данных и позволил им иметь несколько записей о его истории. В этой таблице PB_HiscoreEntry будет много баллов, но, выполнив простое убывание OrderBy, я могу создать реальный список историй, в котором тот, у кого самый высокий балл, находится сверху, а самый низкий - снизу. Моя проблема здесь в том, что моя база данных не имеет никакого представления о фактическом рейтинге по сравнению с другими. Это то, что я должен сделать, выполнив запрос OrderBy, описанный выше.

Вот код, который поможет проиллюстрировать то, что я хочу заархивировать:

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, который мне нужно отправить по телеграфу.

Значит, у кого-нибудь есть представление о том, как я могу это сделать, или я здесь на совершенно неверном пути?

1 Ответ

6 голосов
/ 28 января 2011

Вы на правильном пути, вам просто нужно использовать перегрузку Queryable.Select, которая требует дополнительного индекса. Взгляните на это:

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
});

Я не уверен на 100%, если Entity Framework знает, как работать с Select<TSource, TResult>(this IQueryable<TSource>, Expression<Func<TSource, int, TResult>>) перегрузка. Если это так, просто используйте эквивалентный метод статического Enumerable класса:

// 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
});

Надеюсь, это поможет.

...