【问题标题】:Linq: the query with Grouping, having and MaxLinq:带有 Grouping、Have 和 Max 的查询
【发布时间】:2011-12-14 18:16:06
【问题描述】:

我正在尝试运行以下 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”)。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: linq group-by max


    【解决方案1】:

    更新 - 我想你正在寻找这个:

    var res =  from c in CoverageRate
               group c by c.PolicyCode into rateGroup
               select rateGroup.OrderByDescending(x => x.VersionNumber)
                               .FirstOrDefault();
    

    【讨论】:

    • 让我看看这个。谢谢!
    • 不幸的是我有同样的错误。 :( 我知道问题出在 max 部分。只要我将其更改为某个数字,它就可以工作。由于某种原因,linq 不喜欢使用 max。
    • @Seacat - 你使用的是 Linq to Entities 还是类似的东西?
    • 感谢您的更新,但我认为这是错误的,因为我需要知道的不是整个表格的最大值,而是每个组的最大值。记录应按 policyCode 分组,我需要查找每个组是否有版本等于 25 的记录,如果没有,则取每个组不同的最大值。
    • 是的,我使用实体链接。实际上它是 EF4.1,我在存储库中工作。
    【解决方案2】:
    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()
                            }
    

    【讨论】:

    • 感谢您的回答,但结果是一样的。实际上,目标不是知道计数,而是让它起作用。因为我通过调用 Count() 所做的只是让 Linq 执行查询并查看它是否有效。但它没有:(
    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多