【问题标题】:jqGrid/NHibernate/SQL: navigate to selected recordjqGrid/NHibernate/SQL:导航到选定的记录
【发布时间】:2009-12-15 16:52:25
【问题描述】:

我使用 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 可能优化查询,因为没有定义顺序......在这种情况下,如果我拉 ALL 查询数据 once,然后将以编程方式在 C# 中对查询结果的指定部分进行切片 - 这样就不会发生第二次查询。但当然会慢得多。

或者,还有其他方法吗?

【问题讨论】:

    标签: nhibernate jqgrid


    【解决方案1】:

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

    【讨论】:

    • 不知道如何获取id前的订单数?如果查询按 id 排序那么容易,但它通常按名称或类似方式排序...目前我将只从服务器获取 ID 列表(同时仍在排序和过滤)并在那里执行 IndexOf(id) .
    • 如果它按名称排序,那么您需要查找 id 的名称并限制为小于或大于(取决于排序方向)该名称的行并计算这些行。
    • 如果有几个相同的名字?这是通往地狱的道路;-)
    • 然后您将使用 id 列作为决胜局的第二个排序列。
    【解决方案2】:

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

        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。

    当然,我总是使用排序,否则这种方法将不起作用。

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

    更新:嗯,如果我最初按 id 排序,我将能够使用“SELECT COUNT(*) ... WHERE id

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多