Max抛出InvalidOperationException

时间:2016-09-21 00:43:35

标签: c# linq

我有这个查询

decimal? query = context.History
   .Where(x => x.ItemId == Id
       && x.OtherFilter == IdOtherFilter
       && x.Fecha < Fecha)
   .Select(x => x.Secuencia)
   .Max();

我需要在Linq中执行此查询:

select max(Secuencia)
    from History
    where ItemId= 1406 
        and OtherFilter= 3
        and Fecha < '20150922'
        group by OtherFilter

我需要从符合条件的表中获取最大Secuencia,当条件返回数据时它可以正常工作,但是当没有数据与条件匹配时,Max()无法实现抛出 InvalidOperationException < /强>,

The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type. 

如何避免?

我可以使用另一个Linq吗?

那些句子是等价的吗?如果没有我的linq有什么问题?

2 个答案:

答案 0 :(得分:2)

假设Secuencia属性的类型为decimal而非decimal?,您应尝试向decimal?添加强制转换,以便Max返回如果没有值,则null

decimal? query = context.History
   .Where(x => x.ItemId == Id
       && x.OtherFilter == IdOtherFilter
       && x.Fecha < Fecha)
   .Select(x => (decimal?) x.Secuencia)
   .Max();

decimal? query = context.History
   .Where(x => x.ItemId == Id
       && x.OtherFilter == IdOtherFilter
       && x.Fecha < Fecha)
   .Select(x => x.Secuencia)
   .Cast<decimal?>()
   .Max();

答案 1 :(得分:1)

进行以下修改以使其有效,在DefaultIfEmpty()调用之前添加Max(),这将处理空list,您也可以指定自定义默认值,如0.0 ,此处为null,因为所选类型为nullable value type,请检查DefaultIfEmpty

decimal? query = context.History
   .Where(x => x.ItemId == Id
       && x.OtherFilter == IdOtherFilter
       && x.Fecha < Fecha)
   .Select(x => x.Secuencia)
   .DefaultIfEmpty()
   .Max();