我使用以下查询,使用实体框架从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])
);