Нет хорошего стиля, чтобы делать что-то подобное.Вы бы лучше выяснили , почему запрос завершается неудачно в первый раз, но выполняется во второй раз.
Кажется возможным, что Sql Server должен изначально скомпилировать план выполнения и затем выполнить запрос.Таким образом, первый вызов завершается неудачно, потому что объединенное время превышает ваше свойство timeout, и успешно во второй раз, потому что план выполнения уже скомпилирован и сохранен.
Я не знаю, как работает UsersDataContext, но это может быть такчто у вас есть возможность Prepare
запрос до его фактического выполнения.
Реальный ответ: Если бы мне пришлось это сделать, я бы повторил попытку только один раз, а не снова, например так:
var results = new List<UserSummaryDto>();
using (var ctx = new
UsersDataContext(ConfigurationManager.ConnectionStrings[CONNECTION_STRING_KEY].ConnectionString))
{
try
{
results = ctx.SearchPhoneList(value, maxRows)
.Select(user => user.ToDto())
.ToList();
break;
}
catch (SqlException)
{
try
{
results = ctx.SearchPhoneList(value, maxRows)
.Select(user => user.ToDto())
.ToList();
break;
}
catch (SqlException)
{
// set return value, or indicate failure to user however
}
}
}
}
return results;
Хотя я могу доверять вам , чтобы он не злоупотреблял процессом повторных попыток, вы бы соблазнили своего преемника увеличить число повторов в качестве быстрого исправления.