0

我知道我的 DB 层返回其 DTO 对象的 IQueryable。我使用 NHibernate,它支持 Linq。但问题是,当我的数据库层离开时,我必须关闭会话,因此 IQueryable 不再工作。但我也无法返回列表,因为这样查询将不会在 SQL Server 上执行。

那么我是否有可能返回一个 IQueryable,使用 Nhibernate LINQ 执行表达式并返回一个新的 IQueryable?

也许是这样的:

public IQueryable<TagDTO> Tags
    {
        get
        {
            using (var session = factory.OpenSession())
            {
                return new ExceuteQueryable<TagDTO>(session.Query<TagDTO>());
                //return session.Query<TagDTO>();
            }
        }
    }

ExceuteQueryable 应该在哪里使用它的表达式树来执行查询,获取结果列表并返回列表的新 iqueryable?

4

1 回答 1

0

提前执行与返回列表相同。如果没有与数据库(会话)的连接,您怎么可能对其执行查询?不要像这样对会话进行微观管理,而是使用/保持整个业务操作的会话,并且关闭的事务不再有问题。

从 DAL 返回 IQueryable 会比您想象的更快导致痛苦,因为数据访问绝对没有上下文来优化访问(渴望获取、过滤、 ToList() 以进行多次迭代)。如果没有上下文,一致的缓存也几乎是不可能的。

于 2013-02-19T07:41:08.683 回答