我如何调用函数方法在Linq实体框架和保持分页

本文关键字:框架 实体 Linq 分页 方法 何调用 调用 函数 | 更新日期: 2023-09-27 18:11:39

我需要将一些分页数据从Linq转换为实体框架。数据应该在MVC Contrib Grid/Pager中显示,因此需要进行分页,后端SQL Server应该对数据进行分页。

所以我有这段代码作为工作基础:

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

这将生成一个带有SELECT TOP (10) ... WHERE rownum ETC..
的漂亮的分页SQL查询很好,后端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(系统。Int32], Boolean)'方法,并且该方法不能转换为存储表达式。

所以我需要ToList()实体来调用我的翻译方法,像这样:
var fixedData = from v in highscores.ToList()
                select GetUrlForImage(v.UserId,v.Score,v.IsAnonymous);

技术上现在工作,但我已经失去了后端SQL Server分页,因为IQueryable()ToList()转换。

在这种情况下如何进行服务器端分页?

我如何调用函数方法在Linq实体框架和保持分页

在ToList之前应用分页,然后进行转换:

var fixedData = from v in highscores.AsPagination(page.GetValueOrDefault(1), 10).ToList()
                select GetUrlForImage(v.UserId,v.Score,v.IsAnonymous);
编辑:要使用MVC贡献网格,您需要将其与CustomPagination<T>类包装起来,这是内置在MVC贡献:
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);
}