Как вызвать методы функций в Linq для Entity Framework и сохранить нумерацию страниц? - PullRequest
1 голос
/ 20 октября 2011

Мне нужно преобразовать некоторые разбитые на страницы данные из Linq в Entity Framework.Данные должны отображаться в MVC Contrib Grid / Pager, поэтому их нужно разбивать на страницы, а внутренний сервер SQL должен разбивать данные на страницы.

Итак, у меня есть этот код в качестве рабочей базы:

MyEntities db = new MyEntities();
IQueryable<HighScore> highscores = db.HighScores.OrderBy(s => s.Id);
return View(highscores.AsPagination(page.GetValueOrDefault(1), 10));

Это генерирует довольно постраничный SQL-запрос с SELECT TOP (10) ... WHERE rownum ETC..
Отличное разбиение на страницы SQL Server, как это должно быть.

Так что теперь мне нужно преобразовать мои сущности в немного другую модель.

private HighScoreModel GetUrlForImage(string userId, int? score, bool isAnonymous)
{
  return new HighScoreModel
  {
    // transformation, left out for simplicity
  };
}

Я не могу просто сделать:

var fixedData = from v in highscores
                select GetUrlForImage(v.UserId, v.Score, v.IsAnonymous);

, потому что это даст мне (ожидаемый): LINQ to Entities does not recognize the method 'MvcContribTest.Models.HighScoreModel GetUrlForImage(System.String, System.Nullable 1 [System.Int32], Boolean) 'метод,и этот метод не может быть переведен в выражение хранилища.

Поэтому мне нужно ToList() сущностей, чтобы вызвать мой метод перевода, что-то вроде этого:

var fixedData = from v in highscores.ToList()
                select GetUrlForImage(v.UserId,v.Score,v.IsAnonymous);

Что технически сейчасработает, но я потерял нумерацию страниц SQL-сервера, потому что преобразование ToList() из IQueryable().

Как я могу выполнить нумерацию страниц на стороне сервера в этом сценарии?

1 Ответ

1 голос
/ 20 октября 2011

Как насчет применения разбивки на страницы перед списком ToList, затем выполните преобразование:

var fixedData = from v in highscores.AsPagination(page.GetValueOrDefault(1), 10).ToList()
                select GetUrlForImage(v.UserId,v.Score,v.IsAnonymous);

РЕДАКТИРОВАТЬ: для использования с сеткой MVC Contrib вам нужно будет обернуть его классом CustomPagination<T>, это встроенный в MVC Contrib:

public ActionResult Index(int? page)
{
  var itemsPerPage = 5;
  var db = new MyEntities();
  var totalItems = db.HighScores.Count();

  IQueryable<HighScore> highscores = db.HighScores.OrderBy(highscore => highscore.ID);
  var pagedData = from highscore in highscores.AsPagination(page.GetValueOrDefault(1), itemsPerPage).ToList()
                  select highscore;

  var transformedData = new CustomPagination<HighScoreModel>(pagedData.Select(highscore => TransformData(highscore)), 
                                                             page.HasValue ? page.Value : 1, 
                                                             itemsPerPage,
                                                             totalItems);
  return View(transformedData);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...