0

我们有一个查询单个记录的存储库(实体框架) - 对于任何给定的查询,应该只存在一条记录。最初,我们的查询是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();

编辑
一个重要的说明:我们希望了解模棱两可的结果以及返回的记录数。

4

1 回答 1

3

注意不要意外多次执行查询。

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行以处理所有情况。

于 2012-11-29T16:49:46.750 回答