实体框架.Skip无法正常工作

时间:2011-01-21 15:07:19

标签: c# asp.net-mvc entity-framework jqgrid

我正在尝试使jqGrid中的导航箭头正常工作。 MVC 3 RC2,实体框架4,.NET Framework 4,jqGrid 3.8.2

问题是,我没有记录从1到10,11到20等等。似乎.skip方法无法正常工作。

jqGrid使用正确的参数调用ActionResult。

也许你有个主意?

的问候,

    //
    // 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 个答案:

答案 0 :(得分:1)

外部查询的

.OrderBy()需要 .Skip()之前的。据我所知,按照你的方式做它甚至不应该工作。如果它可以工作,你可能在对象空间,而不是L2E。您必须在之前订购,否则请跳过或参加。

答案 1 :(得分:1)

这是解决方案:

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