Linq: запрос с группировкой, имея и Макс - PullRequest
3 голосов
/ 14 декабря 2011

Я пытаюсь запустить следующий запрос MS SQL:

 select PolicyCode, OccupancyCode, premiumcode, VersionNumber, rate
 from COVERAGE_RATES as cov
 group by PolicyCode, OccupancyCode, PremiumCode,VersionNumber, rate
 having (VersionNumber = 25 or VersionNumber = 
 (
     select MAX(versionnumber) from COVERAGE_RATES where
     PolicyCode = 4 and OccupancyCode=2 and PremiumCode = cov.PremiumCode
 ) ) and PolicyCode = 4
 AND OccupancyCode = 2

Идея состоит в том, чтобы взять записи, где VersionNumber равен 25 или, если в группе нет такой версии, взять максимальное число,То есть, если у нас есть таблица:

policyCode Version ...
----------------------
1          2
1          10
2          1
2          25
2          26

У нас должен быть следующий результат:

policyCode Version ...
----------------------
1          10
2          25

Код Linq:

var res = (from c in CoverageRate
                       group c by c.PolicyCode
                           into rateGroup
                           where rateGroup.Any(r => r.VersionNumber == versionNumber ||
                           r.VersionNumber == 
                           CoverageRate.Where(c2 => c2.OccupancyCode == occupancyCode && c2.PolicyCode == policyCode)
                               .Max(c2 => c2.VersionNumber))
                           select rateGroup);

Но я полагаюЯ делаю что-то не так, потому что когда я пытаюсь взять res.Count () у меня появляется следующая ошибка:

Невозможно создать постоянное значение типа '..CoverageRate'.В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Может ли кто-нибудь помочь мне с этим запросом?

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Обновление - я думаю, что вы ищете это:

var res =  from c in CoverageRate
           group c by c.PolicyCode into rateGroup
           select rateGroup.OrderByDescending(x => x.VersionNumber)
                           .FirstOrDefault();
1 голос
/ 14 декабря 2011
from c in CoverageRate
                       group c by c.PolicyCode
                           into g
                           select new
                        {
                            policyCode = g.Key,
                            Version = (from t2 in g select t2.VersionNumber).Max()
                        }
...