对实体的Linq:用Max替换OrderByDescending / First?

时间:2019-07-02 12:19:36

标签: linq linq-to-entities

我使用以下查询,使用实体框架从SQL数据库中提取数据。

var result = ViewHelper.Create<Keyword>().Find(query, inc => inc.Page)
    .GroupBy(g => g.PageId)
    .Select(g => g.OrderByDescending(o => o.Volume).First())
    .OrderByDescending(r => r.Volume)
    .Select(r => new LinkDto(
        currentUrl.ToAbsolute(r.Page.Path),
        r.Term.HighlightExcept(meta.ReservedWords)));

如果您忽略第一行(这是我们自己的存储库内容),那么接下来的三行是重要内容。

我要做的是按PageId对行进行分组,选择Volume最大的行。

然后,根据分组的数据,我再次按Volume重新排序,以按Volume的顺序返回整个列表。

它似乎确实产生了所需的结果,但是众所周知,并不是所有的Linq语句都以相同的方式执行,我相信可以对其进行改进。

首先想到的是OrderByDescending/First元素可以用Max代替-不幸的是,我无法使其在语法上挂在一起。

此陈述是否可以改进。

为完整起见,请参见下表。

CREATE TABLE [dbo].[Keyword] (
    [Id]     SMALLINT      NOT NULL,
    [Term]   VARCHAR (100) NOT NULL,
    [Volume] INT           NOT NULL,
    [PageId] SMALLINT      NOT NULL,
    CONSTRAINT [PK_Keyword] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [AK_Keyword_Keyword] UNIQUE NONCLUSTERED ([Term] ASC),
    CONSTRAINT [FK_Keyword_Page] FOREIGN KEY ([PageId]) REFERENCES [dbo].[Page] ([Id])
);

0 个答案:

没有答案