Search code examples
nhibernatecriteriaicriteriadetachedcriteria

NHibernate: Convert an ICriteria to a DetachedCriteria


Anyone know how to convert an ICriteria into a DetachedCriteria. I need to use an existing ICriteria as part of a subquery using:

.Add(Subqueries.PropertyIn("Name", myDetachedCriteriaSubquery))

Is there any way to convert an ICriteria to a DetachedCriteria. I will accept 'no' with a credible reference.


Solution

  • Following on from mattk's answer, you can inherit DetachedCriteria to access its constructors:

    public class ConvertedDetachedCriteria : DetachedCriteria
    {
        public ConvertedDetachedCriteria(ICriteria criteria) 
            : base((CriteriaImpl) criteria, criteria)
        {
            var impl = (CriteriaImpl) criteria;
            impl.Session = null;
        }
    }
    

    Now you can write code like this:

    var criteria = Session.CreateCriteria<Person>()
       .Add(Restrictions.Eq("Name", "John"));
    
    var clonedDetachedCriteria = new ConvertedDetachedCriteria(criteria);
    
    var newCriteria = Session.CreateCriteria<Person>()
        .SetProjection(Projections.SubQuery(clonedDetachedCriteria))
        .List<string>();
    

    Disclaimer: I've only subject this to minimal testing in NH 2... no guarantees it will work or be of any use.