LINQ 如何解决查询结果为空时 Max 方法报错的问题?
🏷️ C#
当通过 Linq 的 Max 方法查询最大的编号(No)时,如果查询不到数据,就会报 InvalidOperationException 异常。
csharp
int maxNo = db.Blogs.Where(m => m.Day == date).Max(m => m.No);
异常消息如下:
到值类型“
System.Int32
”的强制转换失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可以为 null 的类型。
根据 Stack Overflow 上的回答,有两种解决方案:
案 1
通过 DefaultIfEmpty() 扩展方法指定为空时的默认值,这个方法支持传入一个默认值(defaultValue)参数,不传时默认值为 default(TSource)
。
csharp
int maxNo = db.Blogs.Where(m => m.Day == date).Select(m => m.No).DefaultIfEmpty().Max();
案 2
使用上面的方法无法判断得到结果 0 是查询结果本身就是 0,还是查询结果为空。
如果需要判断空查询结果,可以在 Max() 方法中将返回结果的类型修改为可空类型(这里为 int?
)。
csharp
int? maxNo = db.Blogs.Where(m => m.Day == date).Max(m => (int?)m.No);
通过可空类型的 GetValueOrDefault() 方法可以获得同案 1 相同的效果。
csharp
int maxNo = db.Blogs.Where(m => m.Day == date).Max(m => (int?)m.No).GetValueOrDefault();