NHibernate 多次执行相同的查询

Posted

技术标签:

【中文标题】NHibernate 多次执行相同的查询【英文标题】:NHibernate execute the same query several times 【发布时间】:2020-12-01 21:13:47 【问题描述】:

我多次执行 NHibernate 查询,只更改一个参数。

这是我的代码

  if (channelCount > 1)
                
                    for (int i = 0; i < channelCount; i++)
                    
                        int minOrderItemFirst = Session.GetNamedQuery("GetMinOrderItem")
                            .SetInt32("year", item.Year)
                            .SetString("orderKind", item.OrderKind)
                            .SetInt32("orderNo", item.OrderNo)
                            .SetInt32("orderItem", item.OrderItem)
                            .UniqueResult<int>();

                        
                        //I have minOrderItemFirst as int and I need to use it as .SetInt32("orderItem")
                        // Session.GetNamedQuery("GetMinOrderItem")
                        //    .SetInt32("year", item.Year)
                        //    .SetString("orderKind", item.OrderKind)
                        //    .SetInt32("orderNo", item.OrderNo)
                        //    .SetInt32("orderItem", minOrderItemFirst)
                        //    .UniqueResult<int>(); .... etc as said in for loop
                        // I am ok to increment minOrderItemFirst in every next call
    
                     

提前感谢您的帮助!

【问题讨论】:

我不确定 - 您是在问如何让 nhibernate 多次运行查询,每次更改一个参数,还是在抱怨 nhibernate 在您不希望的情况下多次运行查询它到? 我在问如何做好! 哦.. 呃...好吧,您使用 nHibernate 的方式我不太认识;看起来你有点像使用参数化 SQL 的一些薄包装器一样使用它,它会自动为你映射 POCO,有点像 Dapper 那样,所以你真的需要考虑更改 GetMinOrderItem 所以它基于像“SELECT * FROM 不管 WHERE”这样的查询id IN (@p1,@p2,@p3)" 然后一次调用 3 个项目(例如)或查看 nHibernate 是否可以支持表值参数,以便您可以将整个值表传递给 DB 和join it.Better to send 10 values in 1 query than run 1 query 10x 【参考方案1】:

我得到了类似的东西,但我不确定这是一个理想的解决方案。有人可以解释如何用更少的代码或更优雅地实现它?

 if (chCount > 1)
                
                    int[] results = new int[chCount + 1];

                    int firstNumber = Session.GetNamedQuery("GetMinOrderItem")
                        .SetInt32("year", item.Year)
                        .SetString("orderKind", item.OrderKind)
                        .SetInt32("orderNo", item.OrderNo)
                        .SetInt32("orderItem", item.OrderItem)
                        .UniqueResult<int>();

                    results[0] = firstNumber;

                    for (int i = 1; i < chCount; i++)
                    

                        results[i] = Session.GetNamedQuery("GetMinOrderItem")
                            .SetInt32("year", item.Year)
                            .SetString("orderKind", item.OrderKind)
                            .SetInt32("orderNo", item.OrderNo)
                            .SetInt32("orderItem", results[i - 1])
                            .UniqueResult<int>();
                    
                

【讨论】:

以上是关于NHibernate 多次执行相同的查询的主要内容,如果未能解决你的问题,请参考以下文章

将原生 SQL where 子句应用于实体的 Nhibernate 查询

NHibernate 效率

NHibernate 似乎没有批量插入 PostgreSQL

NHibernate体系结构

ASP.NET MVC+WCF+NHibernate+Autofac 框架组合

如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)