Право рамки .Skip не работает правильно - PullRequest
0 голосов
/ 21 января 2011

Я пытаюсь заставить работать навигационные стрелки в jqGrid.MVC 3 RC2, Entity Framework 4, .NET Framework 4, jqGrid 3.8.2

Проблема в том, что я получаю записи не с 1 до 10, с 11 по 20 и так далее.Кажется, что метод .skip работает неправильно.

jqGrid вызывает ActionResult с правильными параметрами.

Может быть, у вас есть идея?float

    //
    // Post: /Admin/IndexGridData
    // Gibt ein JSON Result mit allen Aufträgen für das jqGrid zurück
    [HttpPost]
    public ActionResult IndexGridData(string sidx, string sord, int page, int rows)
    {

        // Ermittlung der Zusatzinformationen die das Grid anzeigt (Anzahl Aufträge, momentan angezeigte Aufträge
        int start = (page -1) * rows;
        int summeauftraege = _db.Auftrag.Where(x => x.AuftragStatus != "storno").Count();
        int totalPages = (int)Math.Ceiling((float)summeauftraege / (float)rows);

        var auftraege = (from auftrag in _db.Auftrag
                     .Include("KT_AuftragStatus")
                     .Include("KT_Bearbeitungsort")
                     .Include("AuftragPartner")
                         select new
                         {
                             Titel = auftrag.Titel,
                             Auftrag_GUID = auftrag.Auftrag_GUID,
                             Bearbeitungsort = auftrag.KT_Bearbeitungsort.Text,
                             AuftragStatus = auftrag.KT_AuftragStatus.Text,
                         }).Where(x => x.AuftragStatus != "storniert").OrderBy(x => x.Titel)
                     .Skip(start)
                     .Take(rows)
                     .AsEnumerable().ToList();

        // Sortierung des Grids anwenden
        if (sidx == "Titel" && sord == "asc")
        {
            auftraege = auftraege.OrderBy(x => x.Titel).AsEnumerable().ToList();
        }
        else if (sidx == "Titel" && sord == "desc")
        {
            auftraege = auftraege.OrderByDescending(x => x.Titel).AsEnumerable().ToList();
        }else if (sidx == "Bearbeitungsort" && sord == "asc")
        {
            auftraege = auftraege.OrderBy(x => x.Bearbeitungsort).AsEnumerable().ToList();
        }
        else if (sidx == "Bearbeitungsort" && sord == "desc")
        {
            auftraege = auftraege.OrderByDescending(x => x.Bearbeitungsort).AsEnumerable().ToList();
        }
        else if (sidx == "AuftragStatus" && sord == "asc")
        {
            auftraege = auftraege.OrderBy(x => x.AuftragStatus).AsEnumerable().ToList();
        }
        else if (sidx == "AuftragStatus" && sord == "desc")
        {
            auftraege = auftraege.OrderByDescending(x => x.AuftragStatus).AsEnumerable().ToList();
        }           


        // Erstellung des JSON Objekts welches die einzelnen Aufträge enthält
        var jsonauftraege = new object[auftraege.Count()];
        for (int i = 0; i < auftraege.Count; i++)
        {
            jsonauftraege[i] = new
            {
                id = auftraege[i].KA_Auftrag_GUID,
                cell = new[] { 
                "Details",
                "Bearbeiten",
                (auftraege[i].Titel != null) ? auftraege[i].Titel.ToString(): "&nbsp;", 
               (auftraege[i].Bearbeitungsort != null) ? auftraege[i].Bearbeitungsort.ToString(): "&nbsp;", 
                (auftraege[i].AuftragStatus != null) ? auftraege[i].AuftragStatus.ToString(): "&nbsp;", 
            }
            };
        }

        // Erstellung des JSON Results welches das Grid versteht
        var result = new JsonResult();
        result.Data = new { page = page, records = summeauftraege, rows = jsonauftraege, total = totalPages };

        return Json(result.Data);
    }

Ответы [ 2 ]

1 голос
/ 28 января 2011

вот решение:

    //
    // Post: /Admin/IndexGridData
    // Gibt ein JSON Result mit allen Aufträgen für das jqGrid zurück
    [HttpPost]
    public ActionResult IndexGridData(string sidx, string sord, int page, int rows)
    {

        // Ermittlung der Zusatzinformationen die das Grid anzeigt (Anzahl Aufträge, momentan angezeigte Aufträge
        int start = (page - 1) * rows;


       var auftraege = _db.Auftrag
                         .Where(x => x.AuftragStatus != "storno")
                         .OrderBy(x => x.Titel)
                         .Select(auftrag => new AuftragModels.GridAnsicht
                         {
                             Auftrag_GUID = auftrag.Auftrag_GUID,
                              Titel = auftrag.Titel,
                             Bearbeitungsort = auftrag.KT_Bearbeitungsort.Text,
                             AuftragStatus = auftrag.KT_AuftragStatus.Text,
                         }
                          );
        }


        // zusammen gesetztes SQL Statement speichern
        var sqlstring = ((ObjectQuery)auftraege).ToTraceString();

        // Sortierung des Grids anwenden
        if (sidx == "Titel" && sord == "asc")
        {
            auftraege = auftraege.OrderBy(x => x.Titel);
        }
        else if (sidx == "Titel" && sord == "desc")
        {
            auftraege = auftraege.OrderByDescending(x => x.Titel);
        }
        else if (sidx == "Bearbeitungsort" && sord == "asc")
        {
            auftraege = auftraege.OrderBy(x => x.Bearbeitungsort);
        }
        else if (sidx == "Bearbeitungsort" && sord == "desc")
        {
            auftraege = auftraege.OrderByDescending(x => x.Bearbeitungsort);
        }
        else if (sidx == "AuftragStatus" && sord == "asc")
        {
            auftraege = auftraege.OrderBy(x => x.AuftragStatus);
        }
        else if (sidx == "AuftragStatus" && sord == "desc")
        {
            auftraege = auftraege.OrderByDescending(x => x.AuftragStatus);
        }

        // zusammen gesetztes SQL Statement speichern
        //sqlstring = ((ObjectQuery)auftraege).ToTraceString();

        // aufträge zu einer Liste speichern, damit diese durchlaufen werden kann
        var auftragListe = auftraege
                         .AsEnumerable().ToList();

        // Anzahl der Seiten berechnen
        int summeauftraege = auftragListe.Count();
        int totalPages = (int)Math.Ceiling((float)summeauftraege / (float)rows);

        // nur die Aufträge anzeigen, die auf eienr Seite sichtbar sind
        auftragListe = auftragListe
                         .Skip(start)
                         .Take(rows)
                         .AsEnumerable().ToList();

        // Erstellung des JSON Objekts welches die einzelnen Aufträge enthält
        var jsonauftraege = new object[auftragListe.Count()];
        for (int i = 0; i < auftragListe.Count(); i++)
        {
            jsonauftraege[i] = new
            {
                id = auftragListe[i].Auftrag_GUID,
                cell = new[] { 
                "Details",
                "Bearbeiten",
                (auftragListe[i].Titel != null) ? auftragListe[i].Titel.ToString(): "&nbsp;", 
                (auftragListe[i].Bearbeitungsort != null) ? auftragListe[i].Bearbeitungsort.ToString(): "&nbsp;", 
                (auftragListe[i].AuftragStatus != null) ? auftragListe[i].AuftragStatus.ToString(): "&nbsp;", 
            }
            };
        }

        // Erstellung des JSON Results welches das Grid versteht
        var result = new JsonResult();
        result.Data = new { page = page, records = summeauftraege, rows = jsonauftraege, total = totalPages };

        return Json(result.Data);
    }
1 голос
/ 22 января 2011

.OrderBy() на внешний запрос должен прийти до .Skip(). Насколько я понимаю, делать это так, как у вас, не должно даже работать. Если это вообще работает, вы, вероятно, находитесь в объектном пространстве, а не в L2E. Вы должны заказать , прежде чем пропустить или взять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...