如何使用NHibernate迭代整个表?

时间:2011-03-29 13:45:00

标签: nhibernate iterator

我正在寻找一个简单的NHibernate示例,它将向我展示如何在整个表上进行迭代。这是我到目前为止所做的,但它不起作用。我得到一个“System.InvalidOperationException:由于对象的当前状态,操作无效。”我做错了什么?

    public IEnumerable<EMPDATA> getEMPData()
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            IEnumerable<EMPDATA> empData = session.CreateQuery("from EMPDATA").Enumerable<EMPDATA>();
            return empData;
        }
    }

    public static void Main(System.String[] args)
    {
        log.Debug("Entered main");
        Console.WriteLine("Entered main");
        try
        {
            IEMPDataRepository repository = new EMPDataRepository();
            IEnumerable<EMPDATA> iterList = repository.getEMPData();
            while( iterList.GetEnumerator().MoveNext())
            {
                EMPDATA emp = iterList.GetEnumerator().Current;
                log.Debug(emp.EMP_ID);
            }
        }
        catch (System.Exception ex)
        {
            log.Error("Exception occured reading emp data", ex);
        }

这是我的映射:

                                                      

3 个答案:

答案 0 :(得分:1)

您请求一个可枚举的结果,这可能依赖于仍处于打开状态的会话。

因为您在返回Enumerable实例后处理会话,所以您已关闭与数据库的连接。

编辑:见NotSupportedException on IQuery's Enumerable when using statelesssession

答案 1 :(得分:0)

简短回答:使用.List代替.Enumerable

答案 2 :(得分:0)

更长的回答:
我同意菲尔的看法 - 看起来像是SP的工作 2.迭戈(显然)是正确的,但如果我是你,我会使用SetFirstResult()和SetMaxResult()来控制你在每次迭代中加载到内存中的数据量(不要忘记按什么时候排序)当然,使用这种方法)。