Ошибка при выполнении асинхронного вызова пагинации - PullRequest
0 голосов
/ 15 мая 2018

У меня есть приложение ASP .Net Core MVC, в котором у меня есть таблица в представлении, которая заполняется данными из запроса структуры сущностей.Следуя этому руководству , я реализовал код для разбивки на таблицы.По какой-то причине, когда запрос данных таблицы отправляется со стороны клиента в действие контроллера, возникает следующая ошибка:

InvalidOperationException: The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IEntityQueryProvider can be used for Entity Framework asynchronous operations.

Вот действие контроллера:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> GetResultList(ResortDataJoinObj resDeals, int page =1)
        {
            if (ModelState.IsValid)
            {
                var resultsObj = (from rd in _db.ResortData
                                  join ra in _db.ResortAvailability on rd.RecNo equals ra.RecNoDate
                                  where ra.TotalPrice < Int32.Parse(resDeals.priceHighEnd) && ra.TotalPrice > Int32.Parse(resDeals.priceLowEnd)

                                  select new
                                  {
                                      Name = rd.Name,
                                      ImageUrl = rd.ImageUrl,
                                      ResortDetails = rd.ResortDetails,
                                      CheckIn = ra.CheckIn,
                                      Address = rd.Address,
                                      TotalPrice = ra.TotalPrice

                                  });

                int i = 0;
                List<ResortDealResultsObject> resultList = new List<ResortDealResultsObject>();
                foreach (var row in resultsObj)
                {
                        var tempVm = new ResortDealResultsObject
                        {
                            Name = row.Name,
                            ImageUrl = row.ImageUrl,
                            ResortDetails = row.ResortDetails,
                            CheckIn = row.CheckIn,
                            Address = row.Address,
                            TotalPrice = row.TotalPrice
                        };
                        resultList.Add(tempVm);
                }
                int pageSize = 3;
                var model = await PaginatedList<ResortDealResultsObject>.CreateAsync(resultList.AsQueryable(), page, pageSize);

                ResortDataJoinObj joinObj = new ResortDataJoinObj();
                joinObj.PageList = model;
                ViewBag.rowsReturned = true;
                return View(joinObj);
            }
            return View(resDeals);
        }

Похоже, что ошибка вызвана строкой var model = await PaginatedList<ResortDealResultsObject>.CreateAsync(resultList.AsQueryable(), page, pageSize);

Эта строка вызывает метод в классе PaginatedList, который реализован в своем собственном файле (как описано в руководстве):

public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
{
    var count = await source.CountAsync();
    var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
    return new PaginatedList<T>(items, count, pageIndex, pageSize);
}

Там нет ошибок прекомпилятора или ошибок компиляции, поэтому я не уверен, что именно здесь не так, поскольку я очень внимательно следую руководству. Что может быть причиной ошибки?

1 Ответ

0 голосов
/ 15 мая 2018
List<ResortDealResultsObject> resultList = new List<ResortDealResultsObject>();
            foreach (var row in resultsObj)
            {
                    var tempVm = new ResortDealResultsObject
                    {
                        Name = row.Name,
                        ImageUrl = row.ImageUrl,
                        ResortDetails = row.ResortDetails,
                        CheckIn = row.CheckIn,
                        Address = row.Address,
                        TotalPrice = row.TotalPrice
                    };
                    resultList.Add(tempVm);
            }

Этот код не генерируется структурой объекта и не обеспечивает асинхронные вызовы. У вас уже есть List, когда вы вызываете метод ToListAsync (), поэтому нет смысла приводить его к Queryable и вызывать ToListAsync () для него

Следующий код должен работать

[HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> GetResultList(ResortDataJoinObj resDeals, int page =1)
    {
        if (ModelState.IsValid)
        {
            var resultsObj = from rd in _db.ResortData
                              join ra in _db.ResortAvailability on rd.RecNo equals ra.RecNoDate
                              where ra.TotalPrice < Int32.Parse(resDeals.priceHighEnd) && ra.TotalPrice > Int32.Parse(resDeals.priceLowEnd)

                              select new ResortDealResultsObject
                                 {
                                       Name = rd.Name,
                                       ImageUrl = rd.ImageUrl,
                                       ResortDetails = rd.ResortDetails,
                                       CheckIn = rd.CheckIn,
                                       Address = rd.Address,
                                       TotalPrice = rd.TotalPrice
                                 };

            int pageSize = 3;
            var model = await PaginatedList<ResortDealResultsObject>.CreateAsync(resultsObj, page, pageSize);

            ResortDataJoinObj joinObj = new ResortDataJoinObj();
            joinObj.PageList = model;
            ViewBag.rowsReturned = true;
            return View(joinObj);
        }
        return View(resDeals);
}

Я не тестировал его, поэтому могут быть некоторые ошибки времени компиляции, но логика есть:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...