我们有一个存储库(实体框架),用于查询单个记录 - 对于任何给定的查询,只应存在一条记录。最初,我们的查询是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();
修改
一个重要的注意事项:我们希望了解模糊结果以及返回的记录数。
答案 0 :(得分:2)
注意不要偶然多次执行查询。
var query =
Repository.All()
.Where(*/ some criteria */)
.Take(2) //magic here
.ToList();
if (query.Count == 0) {
// handle empty return
} else if (query.Count > 1) {
// handle unexpected returns
}
return query.Single();
查询TOP 2
行以处理所有情况。