NHibernate: Convert an ICriteria to a DetachedCrit

2019-05-15 09:53发布

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.

3条回答
冷血范
2楼-- · 2019-05-15 10:22

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.

查看更多
一夜七次
3楼-- · 2019-05-15 10:29
var clonedDetachedCriteria = new ConvertedDetachedCriteria(CriteriaTransformer.Clone(criteria));

if Your criteria session null , create "object referans.." exception.

use CriteriaTransformer.Clone(criteria)

查看更多
叛逆
4楼-- · 2019-05-15 10:32

DetachedCriteria has a constructor which takes an ICriteria but it is internal. It is used by CriteriaTransformer. Perhaps you could implement something similar?

查看更多
登录 后发表回答