如何使用分页在NHibernate中执行连接

时间:2014-06-03 08:49:06

标签: nhibernate

我正在对一些使用NHibernate的代码进行一些维护,因为他们对NHibernate几乎一无所知......

我有以下查询

       var query = string.Format(@"select s.Id, s.Iccid, c.Name as Carrier, aa.StartDate as AssignmentDate, cust.Name as AssignedCustomerName 
                    from assetassignment aa 
                    left join SIM s on aa.AssetId = s.Id 
                    left join Carrier c on s.CarrierId = c.Id 
                    left join customer cust on aa.CustomerId = cust.Id 
                    where aa.enddate is null
                    and aa.CustomerId in ({0}) 
                    and s.dateremoved is null",
                    string.Join(",",idsToInclude));
    if (!string.IsNullOrWhiteSpace(carrier))
    {
        query += " and c.Name = '" + carrier + "'";
    }
   var results = _session.CreateSQLQuery(query)
       .SetResultTransformer(new AliasToBeanResultTransformer(typeof(HomepageSIMTableRow)))
       .List<HomepageSIMTableRow>();
    return results;

这对我来说很好(并且意味着我没有必须让NHibernate运行起来我可以使用它,但现在我需要添加分页,它只是感觉很臭。

关于如何将其移入NHibernate并增加分页的任何指导都会很棒!

2 个答案:

答案 0 :(得分:1)

我不确定这是否适用于常规SQL,但通常使用NHibernate添加

var results = _session.CreateSQLQuery(query)
   .SetFirstResult(0)
   .SetSetMaxResults(30)
   .SetResultTransformer(new AliasToBeanResultTransformer(typeof(HomepageSIMTableRow)))
   .List<HomepageSIMTableRow>();

这适用于常规Criterias和HQL查询。

您可以将此作为参考:How can you do paging with NHibernate?

答案 1 :(得分:1)

这种感觉&#34;臭的原因&#34;是因为你正在编写SQL并将其直接传递给ORM。

NH在实体层面为paging提供了一个完整的机制。当你急切地加载其他实体时,我发现这有点棘手。

我的建议是:

  • 自己编写分页SQL,这可能会降低风险,因为它会涉及更少的更改
  • 将整个查询转换为使用NH ICriterion查询或HQL语句。

不幸的是,在不知道风险/情况的情况下很难建议哪一个。