![](/img/trans.png)
[英]How do I call a method from within a linq query that is retrieving from an Entity Framework model
[英]How do I call function methods in Linq to Entity Framework and keep pagination?
我需要將一些分頁數據從Linq轉換為Entity Framework。 數據應顯示在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查詢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);
從技術上講現在可以使用,但是由於IQueryable()
的ToList()
轉換,我丟失了后端SQL Server分頁。
在這種情況下,如何進行服務器端分頁?
在ToList之前應用分頁然后進行轉換呢?
var fixedData = from v in highscores.AsPagination(page.GetValueOrDefault(1), 10).ToList()
select GetUrlForImage(v.UserId,v.Score,v.IsAnonymous);
編輯:要與MVC Contrib網格一起使用,您需要使用在MVC Contrib中內置的CustomPagination<T>
類包裝它:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.