使用EF5的where子句可以获得最大值?

时间:2013-11-20 17:47:49

标签: c# linq entity-framework linq-to-sql

我已经尝试了所有方案,但无法使其发挥作用。什么是EF5语法来检索最大字段值并同时使用where子句?

这是我尝试过的:

int result = context.ArchiveItems.Where(x => x.LevelA == levelA && x.LevelB == levelB && x.LevelC == levelC).Max(y => y.LevelCItem);

这是表格。所有“Level *”列都存在于唯一约束中。我需要MAX LevelCItem,其中OTHER“Level *”字段存在于某个组合中:

  • 表“ArchiveItems”
  • ItemId bigint PK
  • LevelA int
  • LevelB int
  • LevelC int
  • LevelCItem int

我遇到了一些错误。最新的是:

  

转换为值类型'Int32'失败,因为具体化值   一片空白。结果类型的泛型参数或查询必须   使用可空类型。

提前感谢任何有帮助的人。

3 个答案:

答案 0 :(得分:1)

您的LevelCItem类型为int?

使用:

int result = context.ArchiveItems.Where(x => x.LevelA == levelA && x.LevelB == levelB && x.LevelC == levelC).Max(y => y.LevelCItem ?? 0);

答案 1 :(得分:1)

具体化值为空”的异常意味着应用Where过滤器后的结果集合为空,并且LINQ不支持评估空集合属性的最大值-to-实体。 (他们显然有点怀疑默认应该是0。)你可以通过强制转换为可以为空的int?来解决问题:

int? result = context.ArchiveItems
    .Where(x => x.LevelA == levelA && x.LevelB == levelB && x.LevelC == levelC)
    .Max(y => (int?)y.LevelCItem);

请注意,返回类型result现在可以为空。如果resultnull,则表示已过滤的集合为空。如果您想在这种情况下获得值0,只需在查询末尾添加GetValueOrDefault()

int result = context.ArchiveItems
    .Where(x => x.LevelA == levelA && x.LevelB == levelB && x.LevelC == levelC)
    .Max(y => (int?)y.LevelCItem)
    .GetValueOrDefault();

答案 2 :(得分:0)

怎么样:

var result = context
.ArchiveItems
.Where(x => x.LevelA == levelA && x.LevelB == levelB && x.LevelC == levelC)
.OrderByDescendig(y => y.LevelCItem)
.Select(y => y.LevelCItem)
.FirstOrDefault();