【问题标题】:entitiy framework .Skip not working correctly实体框架.Skip 无法正常工作
【发布时间】:2011-01-21 15:07:19
【问题描述】:

我正在尝试使 jqGrid 中的导航箭头正常工作。 MVC 3 RC2、实体框架 4、.NET 框架 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);
    }

【问题讨论】:

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


    【解决方案1】:

    .OrderBy() 需要在外部查询之前 .Skip()。据我所知,按照你的方式做它甚至不应该工作。如果它完全有效,那么您可能在对象空间中,而不是 L2E。您必须在跳过或接受之前订购。

    【讨论】:

    • 你能告诉我在哪里做 .OrderBy() 吗?我已经把它移到了 .Include() 方法之后,但它和以前一样。
    • 在Include 和Where 之后在Skip 之前。我怀疑你在OrderBy 之后有Where 调用,这将导致OrderBy 被丢弃。
    • 乍一看,将语言集成 LINQ 与“点”语法混合在一起有点奇怪。我认为应该还可以,但请尝试调用Select() 而不是select
    • 如何在 Visual Studio 中跟踪 SQL?顺便提一句。我没有使用 MS SQL Server。
    • 我与 Sybase 支持人员进行了交谈。他们发现这是他们的 .NET Dataprovider 中的一个错误。所以,我的解决方案是避免他们的错误。
    【解决方案2】:

    解决办法如下:

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

    【讨论】:

    • 也许有人对这些用于排序网格的 if 语句有解决方案?
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多