2016-04-01 10 views
0

私たちのアプリケーションでは、NHibernate.LinqでNH2を使用しています。最新バージョンにアップグレードしたい!NHibernateでエンティティの参照をどのように埋めるのですか?もはやINHibernateQueryable

NH3のLinq機能がNHアセンブリに「組み込み」されていることを読んだことがあります。

Now;私はNH4をインストールしましたが、私たちのコードベースもアップグレードする必要があります。私たちのNH2の実装では

我々が使用:NH4で

/// <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>(); 
    } 

これは/である/でなければならないだろう。

/// <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; 
    } 

/// <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>(); 
    } 

私たちは熱心ロードを追加するための拡張メソッドを持っています

NH4(。Linq)ではもうINHibernateQueryableはありませんが、このコードをどのように変換してウィジェットとして機能させることができますかh NHibernate 4はこれまでと同じように...?

Linqを使用してクエリを書いています。 NH3のよう

答えて

1

我々はすでにLIBのネイティブサポートなどのLINQを持っています。

あなたのエンティティと根を集約関係に照会して、いくつかの可能性をカバーすること、FetchFechtManyThenFetchThenFetchManyを使用することができます。サンプルについて:

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

FetchThenFetchはちょうどあなたがあなたのエンティティとFetchManyに持っているとThenFetchManyエンティティのコレクションを埋めることができます参照を埋めます。

私もNHibernate 3ではQueryOverが少し冗長です(私の意見では)が、SQLステートメントをデータベースに定義するのは非常に柔軟です。

+0

ありがとう!最終的に 'QueryOver'を使うことに決めました。なぜなら、ルートオブジェクト+結果変換上のいくつかの子要素を使って' Fetch'をより良い方法で連鎖させるからです。それ以外にも、 'IQueryOver <>'型だけに基づいて、移行プロセスの拡張メソッドが簡単になります – 321X

1

(私は信じている)あなたが今熱心な負荷エンティティに.Fetch.FetchMany.ThenFetch.ThenFetchManyの拡張機能を使用します。ここで

は、私がこれを使用する方法の例です:NHibernateは4で

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

これらの拡張子が誰かに見当たらないと思われる場合は、「NHibernate.Linq;を使用して」を追加してください。彼らは['IQueryable '拡張機能(https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Linq/EagerFetchingExtensionMethods.cs)のように、その名前空間から来ています。 –

関連する問題