我们有一个查询单个记录的存储库(实体框架) - 对于任何给定的查询,应该只存在一条记录。最初,我们的查询是SingleOrDefault()
.
显然,查询中的多个结果会抛出异常;并且没有一个被try/catch
. 我没有将这些查询包装在一个try/catch
块中,而是提出了一种扩展方法,如下所示:
public static bool IsEmpty<T>(this IQueryable<T> Query, out int Count) {
Count = Query.Count();
return Count == 0;
}
与简单地确定我是否有空查询返回或单个结果返回相比,这在更多方面具有优势。
另一种方法是将我的查询包装在 try/catch 中。我的问题是是否首选扩展方法或捕获异常的费用。为了不主观,我特别指的是捕获和抛出异常的成本与Count()
方法的成本。
虽然预计数据库只返回一条记录,但我的方法是数据库将包含意外记录。我不认为这是一个异常事件,因此我认为不需要抛出异常。
扩展方法的典型实现如下:
var query = Repository.All().Where(*/ some criteria */);
int count;
if (query.IsEmpty(out count)) {
// handle empty return
} else if (count > 1) {
// handle unexpected returns
}
return query.Single();
编辑
一个重要的说明:我们希望了解模棱两可的结果以及返回的记录数。