Использование лямбда-выражений для генерации запроса и его переноса в общий обработчик исключений - PullRequest
0 голосов
/ 02 декабря 2011

В процессе добавления обработки исключений для случайных проблем SQL (случайные таймауты и т. Д.) К моим различным запросам в моем веб-приложении EF4 я действительно должен был реорганизовать общий код обработки исключений в одну функцию для обслуживания.Но я делаю много разных типов запросов 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.

Я попытался обернуть голову вокруг лямбда-выражений, чтобы позволить мне передавать любые запросы по любому типу сущности иесть только один обработчик исключений wiz-bang для поддержки, но я просто еще не там со своими знаниями лямбды и делегата.Я не могу понять это.

Может кто-нибудь дать мне подсказку?Что если бы у меня была другая функция, которая хотела бы выполнить запрос к таблице виджетов и передать ее CheckInternal?Крайне важно, чтобы фактическое перечисление only происходило в функции CheckInternal, поскольку именно здесь будет выброшено исключение.

1 Ответ

1 голос
/ 02 декабря 2011

Если тип возвращаемого значения остается логическим, и вы просто хотите запросить разные сущности в своем примере, вы можете сделать CheckInternal обобщенным и изменить подпись следующим образом:

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

Тогда вы могли бы назвать это так

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