我如何调用函数方法在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()
转换。
在这种情况下如何进行服务器端分页?
在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);
}