代码之家  ›  专栏  ›  技术社区  ›  queen3

jqgrid/nhibernate/sql:导航到所选记录

  •  0
  • queen3  · 技术社区  · 15 年前

    我使用jqgrid显示使用nhibernate检索的数据。jqgrid为我进行分页,我只是告诉nhibernate从“n”开始获取“count”行。

    另外,我想突出显示特定的记录。例如,在员工列表中,我希望在表中显示和预先选择特定的员工(ID)。

    问题是该员工可能在非当前页面上。例如,我从0显示20行,但“突出显示”的员工是25,在第二页。

    可以将初始页面传递给jqgrid,因此,如果我以某种方式使用nhibernate查找“突出显示”员工所在的页面,它将导航到该页面,然后我将使用jqgrid的.setselection(id)方法。

    所以,问题就缩小到了这一点:给定像下面这样的特定搜索查询,如何告诉nhibernate计算“突出显示”员工所在的页面?

    示例查询(简化):

    var query = Session.CreateCriteria<T>();
    foreach (var sr in request.SearchFields)
       query = query.Add(Expression.Like(sr.Key, "%" + sr.Value + "%"));
    query.SetFirstResult((request.Page - 1) * request.Rows)
    query.SetMaxResults(request.Rows)
    

    这里,我需要修改(计算)request.page,以便它指向request.selectedid所在的页面。

    另外,一个有趣的事情是,如果没有定义排序顺序,当我运行两次搜索查询时,我会得到相同的结果吗?我想说的是SQL Server 可以 优化查询,因为未定义订单…在这种情况下,只有当我拉动 所有 查询数据 一旦 ,然后将以编程方式在C中切片查询结果的指定部分,这样就不会出现第二个查询。当然,这会慢得多。

    或者,还有别的办法吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   dotjoe    15 年前

    很肯定你必须用另一个查询来找出这个页面。这当然需要您定义要排序的列。您将需要获得order by和restriction,共同计算该特定ID之前的行数。一旦您有了ID之前的行数,就可以计算出需要选择的页面,并执行常规的分页查询。

        2
  •  0
  •   queen3    15 年前

    好的,所以现在我这样做:

        var iquery = GetPagedCriteria<T>(request, true)
                        .SetProjection(Projections.Property("Id"));
        var ids = iquery.List<Guid>();
        var index = ids.IndexOf(new Guid(request.SelectedId));
        if (index >= 0)
           request.Page = index / request.Rows + 1;
    

    在jqgrid设置选项中

           url: "${Url.Href<MyController>(c => c.JsonIndex(null))}?_SelectedId=${Id}",
           // remove _SelectedId from url once loaded because we only need to find its page once
           gridComplete: function() { 
              $("#grid").setGridParam({url: "${Url.Href<MyController>(c => c.JsonIndex(null))}"}); 
           },
           loadComplete: function() {
              $("#grid").setSelection("${Id}");
           }
    

    也就是说,在请求中,我查找id的索引并设置page if found(jqgrid甚至理解在寻呼机中显示适当的页码,因为我在json数据中将页码返回到in)。在网格设置中,我首先设置URL以包含查找ID,但在加载网格后,我将其从URL中删除,以便上一个/下一个按钮工作。但是,我总是尝试在网格中突出显示选定的ID。

    当然,我总是使用排序,否则方法就行不通了。

    仍然存在的一个问题是,我从数据库中提取所有ID,这有点影响性能。如果有人知道如何在筛选/排序的查询中找到ID的索引,我会接受这个答案(因为这才是真正的问题);如果没有,那么我会接受我自己的答案;-)

    更新:嗯,如果我最初按ID排序,我将能够使用类似“选择计数(*)…其中id<selectedid“。这将消除“拉ID”问题…不过,我还是想先按名字排序。

    更新:在实现之后,我发现了这种技术的一个很好的副作用…排序时,活动/选定项将被保留;-)只有在页面更改时才重置_selectedid,而不是在加载网格时才有效。

    更新:以下是包含上述技术的来源: http://sprokhorenko.blogspot.com/2010/01/jqgrid-mvc-new-version-sources.html