IQueryable.Count()或IEnumerable.Count()与Single()抛出异常?

时间:2012-11-29 16:41:29

标签: c# .net exception linq-to-entities enumeration

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

修改
一个重要的注意事项:我们希望了解模糊结果以及返回的记录数。

1 个答案:

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