Question

S'il vous plaît pardonnez-moi si je suis un peu peu clair, je ne fais que commencer avec les expressions nhibernate / linq / lambda, et je ne suis en fait pas sûr de ce qu'il faut chercher ...

Je travaille avec .NET 2.0 depuis 4 ou 5 ans et j'ai eu l'occasion d'évoluer autrement que moi-même, c'est pourquoi je peux maintenant apprendre New Tech :)

J'ai lu beaucoup de blogs et de messages et j'ai commencé un petit projet personnel où j'essaie d'utiliser le modèle de référentiel aussi bien que possible.

Je suis maintenant dans la situation suivante:

  • Myproject.core.dll: J'ai cet assemblage de base qui contient toute la logique métier et définit le contrat iRipository. Il ne sait rien de l'implémentation réelle du référentiel, il est résolu au moment de l'exécution à l'aide de l'IOC, donc cette DLL de base n'a aucune référence aux DLL Nhibernate.
  • Myproject.data.nhibernate.dll: L'implémentation du référentiel est contenue dans cet assembly qui a toutes les références nécessaires aux DLL Nhibernate.

Mon implémentation de référentiel ressemble à ceci:

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    ...
    public virtual IQueryable<T> All()
    {
        IList<T> entities = Session
            .CreateCriteria( typeof( T ) )
            .List<T>();
        return entities.AsQueryable<T>();
    }
    ...
}

Donc, dans ma DLL de base, je peux obtenir une référence à mon référentiel et faire quelque chose comme:

IList<Person> people = myRepository.All().ToList();

Cela semble bien fonctionner, il interroge la base de données et renvoie toutes les lignes de la table des personnes.

Cependant, maintenant ce que je veux faire, c'est ajouter des prédicats:

IList<Person> daves = myRepository.All().Where(p => p.Name == "Dave").ToList();

Cela fonctionne bien, mais bien sûr, ce qui se passe, c'est que Nhibernate interroge d'abord la base de données pour renvoyer toutes les lignes, puis LINQ filtre les résultats pour ne renvoyer que ceux dont le nom est "Dave".

J'ai regardé partout sur Internet, mais je n'ai pas trouvé comment implémenter cela, j'ai également trouvé beaucoup de choses qui semblent obsolètes, par exemple, j'ai souvent vu des appels à la méthode NH Session.Linq (), je J'ai regardé partout mes DLL, cette méthode est introuvable ...

Si quelqu'un pouvait me pointer dans la bonne direction, peut-être avec un petit exemple ou quelque chose, je serais très grand.

Merci beaucoup!

Était-ce utile?

La solution

C'est assez simple:

Utilisation session.Query<T>():

public virtual IQueryable<T> All()
{
    return Session.Query<T>();
}

Query<T> est une méthode d'extension qui vit dans l'espace de noms NHibernate.Linq.

session.Linq n'est plus pris en charge. C'était le fournisseur LINQ pour nhibernate avant la version 3 et a été remplacé par Query<T>.

Autres conseils

Vous voudrez peut-être regarder l'utilisation du modèle de spécification avec votre référentiel. Il y a un exemple d'implémentation avec nhibernate ici du livre de cuisine Nhibernate 3.0, qui est une excellente ressource à obtenir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top