对优化这个NHibernate查询有什么想法吗?(.未来)

对优化这个NHibernate查询有什么想法吗?(.未来),nhibernate,optimization,Nhibernate,Optimization,我刚刚将我的应用程序从LINQ2SQL转换为NHibernate,我正试图找出如何优化以下示例。我尝试使用.Future方法,但当我的会话关闭时,视图尝试获取数据,我得到一个会话关闭错误 有人知道这种事情的最佳实践吗?我有很多场景,我在LINQ中调用一个方法,该方法使用NHibernate获取数据,但我不想返回不需要的数据 获取所有书籍的方法: public IEnumerable<Book>GetAllBooks() { try

我刚刚将我的应用程序从LINQ2SQL转换为NHibernate,我正试图找出如何优化以下示例。我尝试使用.Future方法,但当我的会话关闭时,视图尝试获取数据,我得到一个会话关闭错误

有人知道这种事情的最佳实践吗?我有很多场景,我在LINQ中调用一个方法,该方法使用NHibernate获取数据,但我不想返回不需要的数据

获取所有书籍的方法:

public IEnumerable<Book>GetAllBooks()
        {
            try
            {
                using (ISession session = NHibernateHelper.OpenSession())
                {
                    return session.CreateCriteria<Widget>().ToList<Book>();
                }
            }
            catch (Exception ex)
            {
                //Error stuff here 
            }
        }
public IEnumerableGetAllBooks()
{
尝试
{
使用(ISession session=NHibernateHelper.OpenSession())
{
return session.CreateCriteria().ToList();
}
}
捕获(例外情况除外)
{
//这里有错误的东西
}
}
方法,然后扩展该功能

        public IEnumerable<Book> GetDefaultBookReadingList()
        {
            return from p in GetAllBooks()
                   where p.IsDefault
                   select p;
        }
public IEnumerable GetDefaultBookReadingList()
{
从GetAllBooks()中的p返回
p.IsDefault在哪里
选择p;
}

一旦使用块关闭会话(在
结束时发生),您将无法检索任何延迟加载的数据

根据应用程序类型,会话管理将有所不同,但存储库不应打开和关闭会话

在web应用程序中,最常见的模式是每个请求会话


在windows应用程序中,它可以是每个业务事务的会话,或者在更简单的实现中,可以是每个视图(模型)的会话

那么我应该在哪里打开和关闭会话呢?在服务层?我真的不想在每个函数中都传递一个会话对象,而且一次只能打开一个会话,所以如果我在使用多个repo时在repo声明时传递会话,它将不会很好地工作。你能再解释一下吗?reposito应使用SessionFactory初始化ries,并使用
GetCurrentSession()
获取会话。例如,可以在web应用程序中的BeginRequest/EndRequest上绑定/解除绑定当前会话。