C# 使用Sum方法和Nhibernate的集合为空时不获取异常

C# 使用Sum方法和Nhibernate的集合为空时不获取异常,c#,linq,nhibernate,sum,iqueryable,C#,Linq,Nhibernate,Sum,Iqueryable,我有一个带有NHibernate的IQueryable,我希望使用linq查询对特定列求和,但是,当我在Where方法上的条件给我一个空结果时,我不想得到异常,但我不想点击查询来获得所有记录,然后在内存上求和,我想使用类似于coalesesql命令的命令作为示例: // I get exception when its empty var query = MyQueryable() .Where(x => x.IsDone) .Sel

我有一个带有NHibernate的
IQueryable
,我希望使用linq查询对特定列求和,但是,当我在
Where
方法上的条件给我一个空结果时,我不想得到异常,但我不想点击查询来获得所有记录,然后在内存上求和,我想使用类似于
coalese
sql命令的命令作为示例:

// I get exception when its empty
var query = MyQueryable()
              .Where(x => x.IsDone)
              .Select(x => x.Value)
              .Sum(); 
我必须这样做:

// I get 0, its ok, but ToList(), list all records on memory, 
// I just want to get a single value

var query = MyQueryable()
               .Where(x => x.IsDone)
               .Select(x => x.Value)
               .ToList()
               .Sum(); 
有办法吗


谢谢。

您需要将
值转换为可为空的类型

例如,假设
Value
int
属性:

var result = MyQueryable()
                 .Where(x => x.IsDone)
                 .Select(x => (int?)x.Value)
                 .Sum()
             ?? 0;

由于可空枚举表上的
Sum()
将为空源返回null,因此合并运算符(
??
)会在出现这种情况时负责返回0。

使用Any运算符的if条件如何?您是否尝试过
DefaultIfEmpty
?NHibernate的Linq不支持
DefaultIfEmpty
:(