【问题标题】:Sortable JqGrid using LINQ to MySQL (DbLinq) and Dynamic LINQ - Orderby doesn't work使用 LINQ to MySQL (DbLinq) 和动态 LINQ 的可排序 JqGrid - Orderby 不起作用
【发布时间】:2011-05-03 23:27:07
【问题描述】:

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

我正在使用 LINQ to SQL 和 MySQL(DbLinq 项目)。

我的操作代码:

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

【问题讨论】:

  • 什么是“sidx”和“sord”?我假设它们是列名和“asc”或“desc”?另外,ZTRepository.GetAllTickets() 返回什么?
  • sidx 和 sord - 如您所料; GetAllTickets() 返回 IQueryable
  • 我修复了代码中的一些错误(请参阅我的答案)。我从我的应用程序中粘贴了一个代码示例,并将并非所有变量都替换为青春。我希望现在我做了所有需要的改变。此外,不要忘记在旧代码中使用id = ticket.ID 而不是i = ticket.ID(参见下面的代码)。

标签: c# jqgrid dynamic-linq dblinq linq-to-mysql


【解决方案1】:

尝试以下方法

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

【讨论】:

  • 你好,奥列格;)。代码看起来很有趣,但我又遇到了“Lambda Parameter not in scope”异常。
  • @kMike:这一定是您的代码中的一个小错误。我发布给您的代码是对另一个答案 stackoverflow.com/questions/3912008/… 的代码的一个小修改。如果您愿意,我可以将整个项目放在网上并将网址粘贴给您。因此,您可以查看工作代码并找到代码中的错误。
  • 嗨。我从这个问题中休息了两天来处理其他事情,但今天我又回到了它。我设法修复了 Lambda 错误,但您提供的反射代码似乎有问题。 System.Reflection.PropertyInfo propertyInfo = typeof(Ticket).GetProperty(sidx);它总是返回 null。我不知道为什么:(
  • @kMike: sidx 的值是Ticket 类的某些属性的名称吗?您可以下载测试应用程序 www.ok-soft-gmbh.com/jqGrid/WfcToJqGrid.zip 并与您的应用程序进行比较。
  • 嗨。终于明白了,怎么回事。那里有一些小写/大写的问题。感谢您的帮助和耐心。我最终使用了你的大部分代码。我刚刚离开了分页支持,因为我不需要它。
【解决方案2】:

tickets 变量是已排序的,但随后您将其用作另一个未排序查询的源,因此它的顺序未确定。您希望在第二个 LINQ 查询中使用 orderby。

【讨论】:

  • 实际上,tickets 变量没有排序。我已经设置了一个断点并查看了调试器。我很害怕,DbLinq Linq to MySQl 的实现可能存在一些问题。它也缺少一些其他功能。我还试图将所有内容合并到一个查询中,但得到“Lambda 参数不在范围内”异常。
猜你喜欢
  • 2014-10-21
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多