如何使用 NHibernate 填充实体中的引用?不再有 INHibernateQueryable

How fill references in entity with NHibernate? No more INHibernateQueryable

在我们的应用程序中,我们将 NH2 与 NHibernate.Linq 一起使用。我们要升级到最新版本!

所以我读到,自 NH3 以来,Linq 功能 'incorperated' 进入了 NH 程序集。

现在;我有 NH4 'installed' 但我们的代码库也必须升级。

在我们的 NH2 实施中,我们使用了:

    /// <summary>
    /// Gets an <see cref="IQueryable{T}"/> of entities.
    /// </summary>
    /// <returns>An <see cref="IQueryable{T}"/> of entities.</returns>
    public virtual IQueryable<T> GetQueryable() {
        return this.Session.Linq<T>();
    }

在 NH4 中这个 is/will/must 是:

    /// <summary>
    /// Gets an <see cref="IQueryable{T}"/> of entities.
    /// </summary>
    /// <returns>An <see cref="IQueryable{T}"/> of entities.</returns>
    public virtual IQueryable<T> GetQueryable() {
        return this.Session.Query<T>();
    }

我们有一个扩展方法来添加预先加载:

    /// <summary>
    /// Adds eager-loading for <paramref name="alias"/>.
    /// </summary>
    /// <typeparam name="T">Queryable type.</typeparam>
    /// <param name="source">A queryable.</param>
    /// <param name="alias">An expression that tells what to eager load.</param>
    /// <returns>A queryable.</returns>
    public static IQueryable<T> Expand<T>(this IQueryable<T> source, Expression<Func<T, object>> alias)
    {
        var nhQueryable = source as INHibernateQueryable;
        if (nhQueryable != null)
        {
            nhQueryable.QueryOptions.AddExpansion(ExpressionProcessor.FindMemberExpression(alias.Body));
        }
        return source;
    }

在 NH4 (.Linq) 中不再有 INHibernateQueryable,但我如何转换此代码,以便它像以前一样与 NHibernate 4 一起工作...?

我们正在使用 Linq 编写查询。

从 NH3 开始(我相信)您现在可以使用 .Fetch.FetchMany.ThenFetch.ThenFetchMany 扩展来预加载实体。

这是我如何使用它的示例:

Order order = orderRepository.Query().Where(x => x.Id == orderId)
                        .FetchMany(x => x.OrderLines)
                        .ThenFetchMany(y => y.SubLines)
                        .ToList()

在 NHibernate 4 中,我们已经将 Linq 作为 lib 的本机支持。

您可以使用 FetchFechtManyThenFetchThenFetchMany,这将涵盖查询实体和聚合根之间关系的一些可能性。例如:

var customers = session.Query<Customer>()
                       .Fetch(x => x.City)
                       .ThenFetch(x => x.State)
                       .ToList();

FetchThenFetch 仅填写您可以在实体上拥有的引用,FetchManyThenFetchMany 填写实体集合。

在 NHibernate 3 中,我们也有 QueryOver,它有点冗长(在我看来),但是在数据库上定义 sql 语句非常灵活。