2009-12-14 13 views
2

Y a-t-il un moyen de filtrer ma requête NHibernate dans le champ SubType avant de frapper la base de données en ajoutant un ICriterion à mes DetachedCriteria en cours d'exécution?Filtrage du sous-type NHibernate avec ICriterion

Mon code ressemble à ceci:

DetachedCriteria detachedCriteria = DetachedCriteria.For(typeof(MyObject)); 

    ProjectionList projectionList = Projections.ProjectionList(); 
    projectionList.Add(Projections.SqlProjection("{alias}.SubType as SubType", new string[] { "SubType" }, new IType[] { TypeFactory.GetAnsiStringType(15) })); 

    dc.SetProjection(projectionList); 
    dc.Add(Expression.Eq("SubType", "MYOBJECT")); 

    using(ISession session = ...) 

    { 

     ICriteria criteria = detachedCriteria.GetExecutableCriteria(session); 

    // Blows up because I don't know how to reference the SubType 
    // field with an ICriterion (Expression.Eq("SubType", "MYOBJECT")) 
     IList list = criteria.List(); 

    ... 

    } 

Bien que cela puisse ne pas être la bonne façon d'atteindre mon objectif, j'espère que c'est au moins possible parce que je ne suis pas impatient d'avoir à factoriser mes interfaces qui attendent/produisent un ICriterion. Je n'ai pas nécessairement accès à la session à proximité de l'endroit où j'ai besoin de créer l'objet ICriterion (mais j'ai un contrôle total sur l'aliasing/nommage des différents champs/tables NHibernate qui seront utilisés).

Répondre

5

A pris un peu de googler pour trouver la réponse à cette question, la voici: http://derek-says.blogspot.com/2008/08/excluding-particular-derived-types-in.html

ICriteria crit = sess.CreateCriteria(typeof(Mammal)); 
    crit.Add(Expression.Not(Expression.Eq("class", typeof(DomesticCat)))); 
    List mammals = crit.List(); 
+0

je besoin de quelque chose comme ça! Je vous remercie! Dans mon cas, j'avais besoin d'une colonne pour contenir 1 à un type spécifique et 2 à un autre! Nous avons fini comme ceci: var = productTypeConditional Projections.Conditional (Restrictions.Eq ("classe", typeof (réfrigérateur)), \t \t \t Projections.Constant (ProductType.Refrigerator), \t \t \t Projections.Constant (ProductType .Pièce)); – cidico