2016-04-01 4 views
0

Dans notre application, nous utilisons NH2 avec NHibernate.Linq. Nous voulons passer à la dernière version! J'ai donc lu que depuis NH3, la fonctionnalité Linq est «incorporée» dans l'assemblage NH.Comment remplir les références dans l'entité avec NHibernate? Plus de INHibernateQueryable

Maintenant; J'ai installé NH4 mais notre base de code doit aussi être mise à niveau.

Dans notre implémentation -NH2, nous avons utilisé:

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

En NH4 c'est/sera/doit être:

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

Nous avons une méthode d'extension pour ajouter le chargement impatient:

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

En NH4 (.Linq) il n'y a plus INHibernateQueryable, mais comment puis-je transformer ce code pour qu'il fonctionne h NHibernate 4 comme il l'habitude de ...?

Nous utilisons Linq pour écrire nos requêtes.

Répondre

1

En NHibernate 4 Nous avons déjà Linq comme support natif sur le répertoire lib.

Vous pouvez utiliser Fetch, FechtMany, ThenFetch et ThenFetchMany, qui couvrira quelques possibilités d'interrogation dans les relations entre vos racines entités et agrégats. Pour exemple:

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

Fetch et ThenFetch vous suffit de remplir une référence que vous pouvez avoir sur votre entité et FetchMany et ThenFetchMany remplir une collection d'entités.

Dans NHibernate 3, nous avons aussi le QueryOver qui est un peu verbeux (à mon avis) mais il est très flexible pour définir vos instructions sql sur la base de données.

+0

Merci! Finalement, j'ai décidé d'opter pour 'QueryOver' parce que cela me permet de mieux chaîner 'Fetch' avec plusieurs éléments enfants sur l'objet racine + transformation de résultat. En plus de cette écriture: Les méthodes d'extension pour le processus de migration sont plus faciles, basées simplement sur le type 'IQueryOver <>' – 321X

1

À partir de NH3 (je crois), vous maintenant utiliser .Fetch, .FetchMany, .ThenFetch et .ThenFetchMany extensions à des entités de charge désireux.

Voici un exemple de la façon dont j'utilise ceci:

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

Si ces extensions semblent manquantes pour quiconque, ajoutez un 'using NHibernate.Linq;'. Ils proviennent de cet espace de noms, en tant qu'extensions ['IQueryable ' (https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Linq/EagerFetchingExtensionMethods.cs). –