2013-10-07 3 views
0

Я хочу построить ICriteria's и передать это функции. Эта функция откроет сеанс и транзакцию. Затем функция выполняет ICriteria.List(); и возвращает список объектов, например, код ниже.NHibernate: Создать iCriteria без сеанса

Я хочу сделать это, потому что я хочу только написать using(ISession Session = ... и Using(ITransaction Transaction = ... для сбора списка объектов. В противном случае я повторяю это много раз.

/// <summary> 
    /// Executes a ICriterion in a new session using a transaction. 
    /// </summary> 
    /// <typeparam name="T">The type of object to operate on.</typeparam> 
    /// <param name="Criterion">The criterion to get the list of objects by.</param> 
    /// <returns>The result of <c>(List<T>)Session.CreateCriteria(typeof(T)).Add(Criterion).List()</c></returns> 
    public static List<T> CriterionToList<T>(ICriterion Criterion) 
    { 
     List<T> Objects = default(List<T>); 
     using (ISession Session = SessionFactory.OpenSession()) 
     { 
      using (ITransaction Transaction = Session.BeginTransaction()) 
      { 
       Objects = (List<T>)Session.CreateCriteria(typeof(T)).Add(Criterion).List<T>(); 
       Transaction.Commit(); 
      } 
     } 
     return Objects; 
    } 

Единственное ICriteria.Add() принимает это ICriterion.

Вопрос

ICriterion не имеет .Add(.. Так что я не могу сделать это:

ICriterion criterion = Restrictions.Eq(Property, Value).Add(... 

Как я еще могу достичь этого, я должен привести его к ICriteria первым, как так?

ICriterion criterion = ((ICriteria)Restrictions.Eq(Property, Value)).Add(... 

Примечание: Проблема заключается в том, что я преобразование огромного проекта, который использует DataTables для сильных типизированных объектов (совместимого с NHibernate). Поэтому у меня много ошибок компиляции, которые мешают мне тестировать мой код, не переведя сначала весь проект.

ответ

4

Я думаю, вы можете достичь этого с помощью DetachedCriteria. Синтаксис и использование будет выглядеть так:

var det = DetachedCriteria.For<T>.Add(Restrictions.Eq(prop, val)); 
using (var session = Config.OpenSession()) 
using (var txn = session.BeginTransaction()) 
{ 
    var result= det.GetExecutableCriteria(session).List(); 
} 

Вы можете легко инкапсулировать транзакцию в отдельную функцию:

public IList<T> GetList<T>(DetachedCriteria detachedCriteria) 
{ 
    IList<T> result; 
    using (var session = Config.OpenSession()) 
    using (var txn = session.BeginTransaction()) 
    { 
     result = detachedCriteria.GetExecutableCriteria(session).List<T>(); 
     txn.Commit(); 
    } 
    return result; 
} 
+1

Ах да! это оно! Его также указано в ссылке: http://nhforge.org/doc/nh/en/ - «Класс DetachedCriteria позволяет создавать запрос за пределами области сеанса, а затем выполнять его с использованием некоторого произвольного ISession». На самом деле это слишком легко, мне должно быть стыдно спрашивать об этом на SO! То, что я не заметил «DetachedCriteria». Спасибо за указатель. –

 Смежные вопросы

  • Нет связанных вопросов^_^