jqGrid / NHibernate / SQL:导航到选定的记录

时间:2009-12-15 16:52:26

标签: nhibernate jqgrid

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

另外,我想强调具体记录。例如,在员工列表中,我希望在表格中显示和预选特定员工(id)。

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

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

所以,问题缩小到这个问题:给定如下的特定搜索查询,如何告诉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 个答案:

答案 0 :(得分:0)

非常确定您必须使用其他查询来确定页面。这肯定需要您定义要排序的列。您需要获取订单和限制一起计算特定ID之前的行。获得id之前的行数后,您可以确定需要选择的页面并执行常用的分页查询。

答案 1 :(得分:0)

好的,所以目前我这样做:

    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的索引并设置页面如果找到(jqGrid甚至理解在寻呼机中显示相应的页码,因为我将页码返回到json数据中)。在网格设置中,我设置url首先包含查找ID,但是在加载网格后我将其从url中删除,以便prev / next按钮起作用。但是我总是尝试在网格中突出显示所选的ID。

当然我总是使用排序,否则该方法将无效。

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

UPDATE:嗯,如果我最初按id排序,我将能够使用像“SELECT COUNT(*)... WHERE id&lt; selectedid”这样的技术。这将消除“拉ids”问题...但我最初想按名称排序。

更新:实施后,我发现了这种技术的一个简洁的副作用......当排序时,活动/选定的项目被保留;-)如果_SelectedId仅在页面被更改时重置,而不是在网格已加载。

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