2013-10-07 48 views
0

我想構造ICriteria的並將其傳遞給一個函數。該功能將打開一個會話和事務。然後函數執行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(... 

注:問題是,我將使用數據表來強類型的對象(與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執行它。」它實際上太容易了,我應該爲此感到羞恥。我沒有注意到'DetachedCriteria'。感謝指針。 –