Skip to content

LINQ 如何解决查询结果为空时 Max 方法报错的问题?

🏷️ C#

当通过 LinqMax 方法查询最大的编号(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();