簡體   English   中英

如何在Linq中調用Entity Framework中的函數方法並保持分頁?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM