Фильтрация подтипа NHibernate с помощью ICriterion - PullRequest
2 голосов
/ 14 декабря 2009

Можно ли как-то отфильтровать свой запрос NHibernate в поле SubType, прежде чем я попаду в базу данных, добавив ICriterion к своему выполнению DetachedCriteria?

Мой код выглядит примерно так:

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

    ...

    }

Хотя это может быть неправильным способом достижения моей цели, я надеюсь, что это по крайней мере возможно, потому что я не с нетерпением жду необходимости реорганизовать мои интерфейсы, которые ожидают / производят ICriterion. У меня также не обязательно есть доступ к сеансу где-то рядом, где мне нужно создать объект ICriterion (но у меня есть полный контроль над псевдонимами / именами различных полей / таблиц NHibernate, которые будут использоваться).

1 Ответ

5 голосов
/ 04 ноября 2010

Немного погуглил, чтобы найти ответ на этот вопрос, вот он: http://derek -says.blogspot.com / 2008/08 / исключая-частности, производного типа-in.html

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