Тайм-аут соединения Linq to Entity, два запроса Linq работают по-разному - PullRequest
2 голосов
/ 03 марта 2020

Я только что провел два дня, пытаясь решить проблему тайм-аута в моем приложении, и недавно сделал простой пример 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

...