表为空时处理MAX()的正确选项

本文关键字:选项 MAX 处理 | 更新日期: 2023-09-27 18:12:28

当表为空时,我猜这三个性能是相似的时间。但不确定当表有数百万条记录时对性能的影响。

1。原来的查询不受影响,但不喜欢,因为必须进行两个单独的数据库查询。

2。不喜欢,因为当没有空表时,必须把所有的行,而不是使用索引来查找最大值。

3。这应该返回null,而不是抛出错误。

long? LastInsertedID;
try
{
  LastInsertedID = db.myTable.Any() ? 
                       db.myTable.Max(p => p.id) 
                     : 0;
  LastInsertedID = db.myTable.Select(p => p.id)
                             .DefaultIfEmpty(0)
                             .Max();
  LastInsertedID = db.myTable.Max(p => p.id); -- cause Exception
}
异常:

{"转换为值类型'System "。Int64'失败,因为物化值为空。结果类型的泛型参数或查询必须使用可空类型。"}

表为空时处理MAX()的正确选项

在我看来,第三种选择是最好的。当集合为空时,数据库查询大多数聚合函数(除了COUNT)返回null,异常消息也建议为空。

你所需要做的就是包括对相应的可空类型的强制转换:

LastInsertedID = db.myTable.Max(p => (long?)p.id);

第二个更好。您避免了多次数据库命中(或一般情况下对集合的命中),这样更清晰,而且不会失败。