开发者

entitiy framework .Skip not working correctly

i'm trying to make the navigation arrows in jqGrid working. MVC 3 RC2, Entity Framework 4, .NET Framework 4, jqGrid 3.8.2

The Problem is, that i'm getting not record from 1 to 10, 11 to 20 and so on. It seems that the .skip method is not working correctly.

jqGrid calls the ActionResult with the right parameters.

Maybe you have an idea?

Regards,

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);
    }


.OrderBy() on the outer query is required to come before .Skip(). As far as I can see, doing it the way you have it should not even work. If it works at all you're probably in object space, not L2E. You must order before you skip or take.


here is the solution:

    //
    // 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);
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜