我已经尝试了所有方案,但无法使其发挥作用。什么是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 *”字段存在于某个组合中:
我遇到了一些错误。最新的是:
转换为值类型'Int32'失败,因为具体化值 一片空白。结果类型的泛型参数或查询必须 使用可空类型。
提前感谢任何有帮助的人。
答案 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
现在可以为空。如果result
为null
,则表示已过滤的集合为空。如果您想在这种情况下获得值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();