C# 使用LINQtoMySQL(DbLinq)和动态LINQ-Orderby对JqGrid进行排序不起作用

C# 使用LINQtoMySQL(DbLinq)和动态LINQ-Orderby对JqGrid进行排序不起作用,c#,jqgrid,dynamic-linq,dblinq,linq-to-mysql,C#,Jqgrid,Dynamic Linq,Dblinq,Linq To Mysql,我对JqGrid中的条目排序有问题。Orderby似乎不起作用。我在代码中设置了断点,并注意到orderby不会改变元素的顺序。你知道会出什么问题吗 我在MySQL DbLinq项目中使用LINQtoSQL 我的行动代码: public ActionResult All(string sidx, string sord, int page, int rows) { var tickets = ZTRepository.GetAllTickets().Ord

我对JqGrid中的条目排序有问题。Orderby似乎不起作用。我在代码中设置了断点,并注意到orderby不会改变元素的顺序。你知道会出什么问题吗

我在MySQL DbLinq项目中使用LINQtoSQL

我的行动代码:

public ActionResult All(string sidx, string sord, int page, int rows)
        {
            var tickets = ZTRepository.GetAllTickets().OrderBy(sidx + " " + sord).ToList();
            var rowdata = (
                from ticket in tickets
                select new {
                    i = ticket.ID,
                    cell = new String[] {
                        ticket.ID.ToString(), ticket.Hardware, ticket.Issue, ticket.IssueDetails, ticket.RequestedBy, ticket.AssignedTo, ticket.Priority.ToString(), ticket.State
                    }
                }).ToArray();

            var jsonData = new
            {
                total = 1, // we'll implement later 
                page = page,
                records = tickets.Count(),
                rows = rowdata
            };

            return Json(jsonData, JsonRequestBehavior.AllowGet);
        }
tickets变量是有序的,但是您使用它作为另一个查询的源,该查询没有排序,因此其顺序是不确定的。您希望在第二个LINQ查询中使用orderby。

尝试以下操作

public ActionResult All(string sidx, string sord, int page, int rows)
{
    IQueryable<Ticket> repository = ZTRepository.GetAllTickets();
    int totalRecords = repository.Count();

    // first sorting the data as IQueryable<Ticket> without converting ToList()
    IQueryable<Ticket> orderdData = repository;
    System.Reflection.PropertyInfo propertyInfo =
        typeof(Ticket).GetProperty (sidx);
    if (propertyInfo != null) {
        orderdData = String.Compare(sord,"desc",StringComparison.Ordinal) == 0 ?
            (from x in repository
             orderby propertyInfo.GetValue (x, null) descending
             select x) :
            (from x in repository
             orderby propertyInfo.GetValue (x, null)
             select x);
    }
    // if you use fields instead of properties, then one can modify the code above
    // to the following
    // System.Reflection.FieldInfo fieldInfo =
    //         typeof(Ticket).GetField (sidx);
    // if (fieldInfo != null) {
    //  orderdData = String.Compare(sord,"desc",StringComparison.Ordinal) == 0 ?
    //      (from x in repository
    //       orderby fieldInfo.GetValue (x, null) descending
    //       select x) :
    //      (from x in repository
    //       orderby fieldInfo.GetValue (x, null)
    //       select x);
    //}

    // paging of the results
    IQueryable<Ticket> pagedData = orderdData
        .Skip ((page > 0? page - 1: 0) * rows)
        .Take (rows);

    // now the select statement with both sorting and paging is prepared
    // and we can get the data
    var rowdata = ( from ticket in tickets
                    select new {
                        id = ticket.ID,
                        cell = new String[] {
                            ticket.ID.ToString(), ticket.Hardware, ticket.Issue,
                            ticket.IssueDetails, ticket.RequestedBy,
                            ticket.AssignedTo, ticket.Priority.ToString(),
                            ticket.State
                        }
                    }).ToList();                

    var jsonData = new {
        total = page,
        records = totalRecords,
        total = (totalRecords + rows - 1) / rows,
        rows = pagedData
    };

    return Json(jsonData, JsonRequestBehavior.AllowGet);
}

这里我假设您的ticket对象的类型是ticket。

实际上,tickets变量没有排序。我已经设置了一个断点并查看了调试器。我很惊讶,DbLinq-Linq-to-MySQl实现可能存在一些问题。它还缺少其他一些功能。我还试图将所有内容合并到一个查询中,但得到的Lambda参数不在范围异常中。sidx和sord是什么?我假设它们是一个列名,是asc还是desc?另外,ZTRepository.GetAllTickets返回什么?sidx和sord—正如您所假设的;GetAllTickets返回iQueryEnable我修复了代码中的一些错误,请参见我的答案。我从应用程序中粘贴了一个代码示例,并没有将所有变量都替换为youth。我希望现在我做了所有需要的改变。此外,不要忘记在旧代码中使用id=ticket.id而不是i=ticket.id。请参见下面的代码。您好,Oleg;。代码看起来很有趣,但我再次得到Lambda参数不在作用域异常中。@kMike:这一定是代码中的一个小错误。我发布给你的代码是对另一个答案代码的一个小修改。如果你愿意,我可以把整个项目放在网上,然后把url粘贴到你身上。因此,您可以查看正在运行的代码并在代码中找到错误。您好。我从这个问题上休息了两天去做别的事情,但今天我又回到了这个问题上。我设法修复了Lambda错误,但您提供的反射代码似乎有问题。System.Reflection.PropertyInfo PropertyInfo=typeofTicket.GetPropertysidx;它总是返回null。我不知道为什么:@kMike:case中sidx的值是Ticket类的某个属性的名称吗?您可以下载测试应用程序www.ok-soft-gmbh.com/jqGrid/WfcToJqGrid.zip,并与您的应用程序进行比较。我终于明白了,到底出了什么问题。存在一些小写/大写的问题。谢谢你的帮助和耐心。我最终使用了你的大部分代码。我刚刚离开了分页支持,因为我不需要它。