У меня есть следующий запрос, который я использую для извлечения данных из базы данных SQL с использованием Entity Framework.
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)));
Если вы игнорируете первую строку (которая является нашей собственной информацией из репозитория), следующаяВажными вещами являются 3 строки.
Я пытаюсь сгруппировать строки по 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])
);