Как конвертировать Mssql запрос в LINQ? - PullRequest
0 голосов
/ 18 мая 2018

Как мне преобразовать этот запрос в выражение 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))

Требуется последние 5записи для каждого IP.Затем мне нужно получить среднее значение для каждой строки.Например, среднее значение для первого ряда всех IP-адресов, второго и так далее.

1 Ответ

0 голосов
/ 20 мая 2018

Я решаю это.Вот ответ.

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
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...