Моя цель - предоставить простой API для извлечения данных из таблицы Payments
(~ 400 строк), которая состоит из 5 столбцов.
Payment: Id (int),
PaymentsNumber (tinyint),
Rate (decimal(18,2)),
ProductType (tinyint),
ClientClubType (tinyint).
Пользователи могут отправлять запросы с помощью параметров запроса (must) возврат ~ 12 строк):
PaymentsRequest
{
public int? PaymentsNumber { get; set; }
public byte? ProductType { get; set; }
public byte? ClientClubType { get; set; }
}
Использование EF-Core:
services.AddDbContext<MyContext>(cfg => cfg.UseSqlServer(Configuration.GetConnectionString(...),optionsBuilder => optionsBuilder.CommandTimeout(60)));
public async Task<IEnumerable<Payments>> GetPaymentsAsync(PaymentsRequest request)
{
IQueryable<Payments> query = this._context.Set<Payments>();
query = query.Where(filter =>
(request.ClientClubType == null || filter.ClientClubType == request.ClientClubType) &&
(request.ProductType == null || filter.ProductType == request.ProductType) &&
(request.PaymentsNumber == null || filter.PaymentsNumber == request.PaymentsNumber));
return await query.ToListAsync();
}
При azure сведения о приложении Я вижу 2 последовательных журнала, вызванных одним и тем же исключением:
- Log1: не удалось выполнить команду DbCommand.
- Log2: истекло время ожидания выполнения. Время ожидания истекло до завершения операции, или сервер не отвечает.
Log1 есть (хотя нет необходимости записывать здесь log2):
Не удалось выполнить команду DbCommand (65 238 мс) [Параметры = [@__ request_ClientClubType_0 = '?' (Размер = 1) (DbType = байт), @__ request_ProductType_1 = '?' (Размер = 1) (DbType = Byte)], CommandType = 'Text', CommandTimeout = '60 ']
SELECT [p]. [Id], [p]. [ClientClubType], [p] . [PaymentsNumber], [p]. [ProductType], [p]. [Rate] FROM [Payments] AS [p] WHERE (([p]. [ClientClubType] = @__ request_ClientClubType_0) И @__ request_ClientClubType_0 НЕ НУЖЕН) И (([стр. * webapp.
Проблема возникает только с производства, а не каждый раз, и я не могу восстановить проблему из MSSMS. Есть идеи?
ОБНОВЛЕНИЕ:
После того как @ panagiotis-kanavos прокомментировал, я обновил свой код до:
services.AddDbContextPool<MyContext>(cfg => cfg.UseSqlServer(Configuration.GetConnectionString(...),optionsBuilder => optionsBuilder.CommandTimeout(60)));
public async Task<IEnumerable<Payments>> GetPaymentsAsync(PaymentsRequest request)
{
IQueryable<Payments> query = this._context.Payments;
query = query.Where(filter =>
(filter.ClientClubType == request.ClientClubType) &&
(filter.ProductType == request.ProductType) &&
(filter.PaymentsNumber == request.PaymentsNumber));
return await query.ToListAsync();
}