【问题标题】:How to perform joins in NHibernate with paging如何在 NHibernate 中使用分页执行连接
【发布时间】:2014-07-23 12:47:36
【问题描述】:

我正在对一些使用 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 领域并添加分页的指导都很棒!

【问题讨论】:

  • 呃,我可能遗漏了一些东西,但这是 SQL 而不是 HQL...您是否以某种方式将 SQL 直接传递给命名查询?
  • 对不起,扩展了我的例子。我通常使用 EF,所以为了证明这个功能和客户反馈,我只是直接通过 NHibernate 传递 sql。这些数据集很大,我的第一次 queryover 尝试是 'select n+1'-tastic
  • 来自英孚,花一些时间在 NH - 相比之下,它很棒! :)

标签: nhibernate


【解决方案1】:

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

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

这适用于常规条件和 HQL 查询。

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

【讨论】:

  • 是的,这就是我使用的方法。不幸的是,您将无法使用 SQL 查询来执行此操作。
  • 好吧,在这种情况下,您应该能够为查询添加限制...?
  • 是的 - 到 OP 的哪个方法。你在建议我更喜欢自己的方式
  • Brilliant - 插入它,我的所有测试都通过了。谢谢! (现在只是忽略我直接传递 SQL :-))
  • @jishi 如果你有连接,这是错误的做法,因为会有更多的 SQL 行,而不是不同的根实体,一个实体会有多个 sql 行,并且对行设置了限制数数。因此,您设置了 30 行限制,这将在连接的 3 个实体中具体化。
【解决方案2】:

这感觉“难闻”的原因是因为您正在编写 SQL 并将其直接传递给 ORM。

NH 在实体级别为paging 提供了完整的机制。但是,当您急切地加载其他实体时,我发现这会变得有些棘手。

我的建议是:

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

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

【讨论】:

  • ICriterion / HQL 的外观如何?
  • 另外,是的,我知道直接 SQL 很糟糕 :)
  • @PaulD'Ambra 看看 jishi 的回答或我的问题中的链接 - 他已经尽我所能解释了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2011-07-24
相关资源
最近更新 更多