Как я могу преобразовать этот запрос в выражение LINQ?
WITH MyRowSet
AS
(
SELECT RH.Id,RH.Reputation,RH.ReputationIpId,CheckDateTime,IpGroup.Name,ROW_NUMBER()
OVER (PARTITION BY ReputationIpId ORDER BY CheckDateTime DESC) AS RowNum
FROM dbo.ReputationHistory As RH
INNER JOIN dbo.ReputationIps as IP ON RH.ReputationIpId=IP.Id
INNER JOIN dbo.ReputationMonitorGroups as IpGroup ON IP.ReputationMonitorGroupId=IpGroup.Id
)
SELECT AVG(Reputation),Name RowNum FROM MyRowSet WHERE RowNum <= 5 Group By RowNum,Name ORDER BY RowNum
Что делает этот запрос? Требуется пять последних записей «Репутация» для каждого «IP» в истории. а затем мы получаем среднее значение для IpGroup.
Первая часть выражения:
reputationHistoryRepository.GetAll()
.GroupBy(el => el.ReputationIpId)
.Select(grp => grp
.OrderBy(gr => gr.CheckDateTime)
.TakeLast(lastRecordNum))
Для каждого IP требуется 5 последних записей. Затем мне нужно получить среднее значение для каждой строки. Например, среднее значение для первой строки всех IP-адресов, второй и так далее.
Что не работает? Обычно я выполняю соединения, используя (from a in b join c in d on as equal ct select new {a = a, c = c}). Select (x => ............. .)





Я решаю это. Вот и ответ.
var result = _reputationHistoryRepository.GetAll()
.Include(ips => ips.ReputationIp)
.ThenInclude(ipGroups => ipGroups.ReputationMonitorGroup)
.GroupBy(repHistory => repHistory.ReputationIpId)
.Select(group => group
.OrderBy(repHistory => repHistory.CheckDateTime)
.TakeLast(countOfRecords)
.Select((reputationHistory, index) => new
{
GroupName = reputationHistory.ReputationIp.ReputationMonitorGroup.Name,
ReputationHistoryObject = reputationHistory,
RowNum = index
}))
.SelectMany(reputationHistory => reputationHistory)
.GroupBy(reputationHistory => new
{
reputationHistory.RowNum,
reputationHistory.GroupName
})
.Select(reputationHistoryGroup => new
{
Reputation = reputationHistoryGroup.Average(x => x.ReputationHistoryObject.Reputation),
GrpName = reputationHistoryGroup.Key.GroupName,
RowNum = reputationHistoryGroup.Key.RowNum
});
lastRecordNum = 5 (по умолчанию) - получить последние 5. Забыл описать эту переменную.