2009-11-18 19 views

Répondre

3

je travaillais comment faire cela en utilisant l'expression IsNotEmpty. Ici, il utilise NHibernate Lambda Extensions:

Session.CreateCriteria<FooBar>() 
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes)) 
    .List<FooBar>(); 
+0

En effet ... et vous m'avez donné l'idée que cela peut être fait de manière plus simple et sans les extensions Nhibernate Lambda. J'ai édité ma réponse pour inclure cette option. – tolism7

28

Voici comment vous pouvez le faire:

var fooBars = Session.CreateCriteria<FooBar>() 
     .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>(); 

... en supposant qu'il existe une propriété de collection (un-à-plusieurs) "Bazs" dans l'objet FooBar.

vous pouvez également utiliser des critères comme détachés:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id")); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 
+0

Très bien! Merci! – ldp615

+0

Cela m'a aidé à résoudre l'erreur NHIBERNATE: "Impossible de trouver un fournisseur d'informations de critères correspondant", merci pour l'exemple simple. – Timbob

5

Ayant vient de résoudre un problème lié et est finalement arrivé à une solution que je pensais que je partagerais la réponse ici:

En supposant que vous voulez la requête des questions d'origine, avec une condition supplémentaire sur la sous-requête:

SELECT * FROM FooBar fb 
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id 
       AND Quantity = 5) 

en supposant que vous avez une référence sur la classe Baz au parent, appelé, dit FooBarRef [en classe Fluent Carte vous utiliseriez la méthode Références()], vous créerait la requête comme suit:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id")) 
     .Add(Expression.Eq("baz.Quantity", 5)); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 

Je ne suis pas convaincu à 100% sur le codage dur de l'alias « ce » qui est l'alias NHibernate attribue automatiquement à l'entité racine (tableau) dans la requête, mais c'est la seule façon que je l'ai trouvé pour référencer la clé de la table de la requête parent à partir de la sous-requête.