NHibernate: преобразование ICriteria в DetachedCriteria - PullRequest
3 голосов
/ 18 ноября 2009

Любой знает, как преобразовать ICriteria в DetachedCriteria. Мне нужно использовать существующую ICriteria как часть подзапроса, используя:

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

Есть ли способ преобразовать ICriteria в DetachedCriteria. Я приму «нет» с заслуживающей доверия ссылкой.

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

Исходя из ответа Мэтка, вы можете наследовать DetachedCriteria для доступа к его конструкторам:

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

Теперь вы можете написать код, подобный этому:

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>();

Отказ от ответственности: я только подвергал это минимальному тестированию в NH 2 ... никаких гарантий, что он будет работать или будет иметь какое-либо применение.

2 голосов
/ 12 октября 2011
var clonedDetachedCriteria = new ConvertedDetachedCriteria(CriteriaTransformer.Clone(criteria));

если ваш критерий сеанса пуст, создать исключение "object referans ..".

использовать CriteriaTransformer.Clone(criteria)

1 голос
/ 28 июля 2010

DetachedCriteria имеет конструктор, который принимает ICriteria, но он является внутренним. Используется CriteriaTransformer. Возможно, вы могли бы реализовать нечто подобное?

...