使用lambdas泛化查询并将其包装在公共异常处理程序中

本文关键字:异常处理程序 包装 泛化 lambdas 查询 使用 | 更新日期: 2023-09-27 18:16:24

在为我的EF4 web应用程序中的各种查询添加偶尔SQL问题(随机超时等)的异常处理过程中,我真的必须将常见异常处理代码重构为一个函数来维护。但是我在不同的实体上做了很多不同类型的LINQ查询。

我认为我的第一次尝试很接近。在这个例子中,我有两个重载函数,它们接受不同类型的参数,执行非常相似的数据库查询:

public bool check_person(string name)
{
    return CheckInternal(people.Where(x => x.user_name == name));
}
public bool check_person(Guid ID)
{
    return CheckInternal(people.Where(x => x.user_ID == ID));
}
protected bool CheckInternal(IQueryable<people> peepQuery)
{
     try
     {
         return(peepQuery).Any(); //causes actual db query
     }
     catch (Exception ue)
     { blah blah retry blah blah }
}

所以我只是把实际的枚举推到CheckInternal函数,该函数具有各种奇特的异常处理和重试逻辑,它完全独立于查询甚至被查询的表。

现在这里的缺点是,我只能传递一个IQueryable<people>,但我希望能够传递一个IQueryable在许多不同的实体类型,而不是people类型。

我试着把我的头围绕lambda来允许我在任何实体类型上传递任何类型的查询,并且只有一个wiz-bang异常处理程序要维护,但我只是还没有与我的lambda和委托知识。我想不明白。

谁能给我点提示吗?如果我有另一个函数想要对widgets表进行查询并将其传递给CheckInternal,该怎么办?在CheckInternal函数中只有实际枚举是至关重要的,因为这将引发异常。

使用lambdas泛化查询并将其包装在公共异常处理程序中

如果返回类型保持为布尔值,并且您只想在示例中查询不同的实体,您可以使CheckInternal泛型并更改签名如下:

protected bool CheckInternal<T>(IQueryable<T> someQuery)
{
   //..
}

那么你可以这样命名

public bool check_person(string name)
{
    return CheckInternal<People>(people.Where(x => x.user_name == name));
}