2008-12-04 6 views
14

Je suis un débutant dans le grand monde de NHibernate. J'utilise la version 2.0.1.GA. Voici ma question. J'ai une table Cars avec la colonne Manufacturer(nvarchar(50)) et une clé primaire ID(int). Ma classe .NET est:C# expressions Lambda et NHibernate

public class Car 
{ 
    public virtual int ID { get; set; } 
    public virtual string Manufacturer { get; set; } 
} 

Maintenant, si je veux récupérer toutes les voitures fabriquées par Mercedes, je dois taper ceci:

using (var session = OpenSession()) 
{ 
    var cars = session 
     .CreateCriteria(typeof(Car)) 
     .Add(Restrictions.Like("Manufacturer", "Mercedes")) 
     .List(); 
    // ... 
} 

Je n'aime pas le fait que je dois préciser la nom de la propriété comme une chaîne :( est-il possible d'avoir quelque chose de plus convivial refactor probablement (c'est seulement une suggestion)?

var ms = session 
    .CreateCriteria<Car>() 
    .Add(c => c.Manufacturer, Restrictions.Like("Mercedes") 
    .List(); 

Tout comme amincit dans la version actuelle (2.0.1.GA) ou dans un futu re version?

Répondre

9

Comme Google Ninja l'a dit, vous pouvez le faire avec NHibernate.Linq. La requête serait alors:

session.Linq<Car>.Where(c => c.Manufacturer == "Mercedes").ToList()

Si quelqu'un se termine ici et utilise NH3.0 la syntaxe est juste un peu différent (merci à Michael Mrozek et Mike pour la suggestion):

session.Query<Car>.Where(c => c.Manufacturer == "Mercedes").ToList()

J'ai utilisé un binaire fourni avec fluent-nhibernate qui fonctionne avec 2.0GA (je ne pense pas à la révision particulière).

+0

Merci, n'a pas eu la syntaxe sur le dessus de ma tête, +1 –

+0

Je pourrais observer que "like" et "equal" ne produiront pas les mêmes résultats. J'ai récemment essayé (pas très dur) de trouver un moyen de faire "comme" dans NHibnate.Linq. J'ai abandonné et j'ai utilisé ICriteria à la place. –

+0

Dans une édition suggérée [Mike] (http://stackoverflow.com/users/77939/mike) a souligné que "Si vous utilisez NHibernate 3.0 ou version ultérieure, le fournisseur LINQ est intégré. L'utilisation est légèrement différente: 'session.Query .Where (c => c.Manufacturer ==" Mercedes "). ToList()' " –

1

Regardez this question here. Quelqu'un a eu la même inquiétude, et d'après ce que je peux comprendre, NHibernate.Linq est bien vivant.

Questions connexes