Я только что провел два дня, пытаясь решить проблему тайм-аута в моем приложении, и недавно сделал простой пример NUnitTets, чтобы сузить проблему, которую я не могу объяснить.
Ниже приведены два метода тестирования FindStatLinq и FindStatMethod
, FindStatLinq
содержит Linq to Entity, а FindStatMethod содержит метод для того же запроса Linq to Entity.
Маги c начинается, когда FindStatLinq
требует 2 seconds
для выполнения, но FindStatMethod
завершается с EF Core execution timeout
и происходит примерно через 60 секунд.
Есть идеи, что здесь происходит и в чем проблема?
DatabaseContext _db;
[SetUp]
public void Setup()
{
var services = new ServiceCollection();
services.AddDatabase("data source=xxx.xxx.x.xxxx;initial catalog=xxxx;user id=xx;password=xxxxx;connection timeout=600");
serviceProvider = services.BuildServiceProvider();
_db = serviceProvider.GetService<DatabaseContext>();
}
public List<Log> Find(int userId, DateTime startDate, DateTime endDate, int page, int pageSize, CancellationToken cancellationToken = default)
{
var skip = (page - 1) * pageSize;
return _db.Logs
.Where(w => w.UserId == userId && w.DateStamp.Date >= startDate && w.DateStamp.Date <= endDate)
.OrderByDescending(o=>o.DateStamp)
.Skip(skip)
.Take(pageSize)
.ToList();
}
//Takes 2 seconds
[Test]
public void FindStatLinq()
{
var startDateTime = DateTime.Today.AddDays(-7);
var endDateTime = DateTime.Today;
int page =1 ;
int pageSize=1000;
var skip = (page - 1) * pageSize;
var userId = 7841;
var find = await _db.Logs
.Where(w => w.UserId == userId && w.DateStamp.Date >= startDateTime && w.DateStamp.Date <= endDateTime)
.OrderByDescending(o => o.DateStamp)
.Skip(skip)
.Take(pageSize)
.ToList();
Assert.Pass();
}
//Fails with timeout
[Test]
public void FindStatMethod()
{
var startDateTime = DateTime.Today.AddDays(-7);
var endDateTime = DateTime.Today;
int page =1 ;
int pageSize=1000;
var userId = 7841;
var find = Find(userId, startDateTime, endDateTime, page, pageSize);
Assert.Pass();
}
Обновление, это какая-то ошибка компилятора, и я открыл проблему с ядром EF GitHub на https://github.com/dotnet/efcore/issues/20145