如何使用Entity框架通过LINQ获取行号?

时间:2011-01-28 10:50:08

标签: entity-framework count row

希望有人可以帮助我,因为我有点卡住了。

我正在一个游戏的核心数据库前面建立一个服务。

数据库有以下两个表:

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 个答案:

答案 0 :(得分:6)

你走在正确的轨道上,你只需要使用需要额外索引的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
});

我希望这会有所帮助。