jqGrid/NHibernate/SQL:导航到所选记录

jqGrid/NHibernate/SQL:导航到所选记录,nhibernate,jqgrid,Nhibernate,Jqgrid,我使用jqGrid显示使用NHibernate检索的数据。jqGrid为我进行分页,我只是告诉NHibernate从n开始获取计数行 另外,我想强调一下具体的记录。例如,在员工列表中,我希望在表中显示并预选特定的员工id 问题是该员工可能位于非当前页面上。例如,我从0开始显示20行,但突出显示的employee为25,位于第二页 可以将初始页面传递给jqGrid,因此,如果我以某种方式使用NHibernate查找突出显示的员工所在的页面,它将导航到该页面,然后我将使用jqGrid的.setSel

我使用jqGrid显示使用NHibernate检索的数据。jqGrid为我进行分页,我只是告诉NHibernate从n开始获取计数行

另外,我想强调一下具体的记录。例如,在员工列表中,我希望在表中显示并预选特定的员工id

问题是该员工可能位于非当前页面上。例如,我从0开始显示20行,但突出显示的employee为25,位于第二页

可以将初始页面传递给jqGrid,因此,如果我以某种方式使用NHibernate查找突出显示的员工所在的页面,它将导航到该页面,然后我将使用jqGrid的.setSelectionid方法

因此,问题缩小到了这一点:给定下面这样的特定搜索查询,我如何告诉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)
这里,我需要修改calculate request.Page,使其指向request.SelectedId所在的页面

另外,一件有趣的事情是,如果没有定义排序顺序,当我运行两次搜索查询时,会得到相同的结果吗?我想说SQL Server可能会优化查询,因为没有定义顺序。。。在这种情况下,如果我一次提取所有查询数据,然后以C语言编程方式对查询结果的指定部分进行切片,则只能得到可预测的结果,这样就不会发生第二次查询。当然,这会慢得多


或者,还有其他方法吗?

非常确定您必须使用另一个查询来计算页面。这肯定需要您定义要排序的列。您需要通过order by和restriction一起计算特定id之前的行数。一旦您有了id之前的行数,您就可以计算出需要选择的页面并执行通常的分页查询。

好的,现在我这样做:

    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数据中。在网格设置中,我首先将url设置为包含查找id,但在加载网格后,我将其从url中删除,以便prev/next按钮工作。但是,我总是尝试在网格中突出显示选定的id

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

仍然存在的一个问题是,我从db中提取所有ID,这对性能有点影响。如果有人能告诉我如何在过滤/排序查询中找到id的索引,我会接受答案,因为这才是真正的问题;如果没有,我会接受我自己的答案-

更新:嗯,如果我一开始按id排序,我将能够使用SELECT COUNT*。。。其中id 更新:实施后,我发现这项技术有一个很好的副作用。。。排序时,将保留活动/选定项目;-如果_SelectedId仅在页面更改时重置,而不是在网格加载时重置,则此操作有效


更新:以下是包含上述技术的来源:

不确定如何在id之前获取订单数量?若查询按id排序那个么简单,但它通常按名称或类似的方式排序。。。目前,我将只从服务器上获取id列表,同时仍然进行排序和筛选,并在其中执行IndexOfid。如果它是按名称排序的,则需要查找id的名称,并根据该名称的排序方向限制为小于或大于的行,并对这些行进行计数。如果有多个相同的名称?这是通往地狱的路-然后使用id列作为tiebreaker的第二个排序列。