使用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
函数中只有实际枚举是至关重要的,因为这将引发异常。
如果返回类型保持为布尔值,并且您只想在示例中查询不同的实体,您可以使CheckInternal
泛型并更改签名如下:
protected bool CheckInternal<T>(IQueryable<T> someQuery)
{
//..
}
那么你可以这样命名
public bool check_person(string name)
{
return CheckInternal<People>(people.Where(x => x.user_name == name));
}