2013-10-07 1 views
0

없이 iCriteria을 만듭니다. 이 함수는 세션과 트랜잭션을 엽니 다. 그런 다음이 함수는 ICriteria.List()를 실행합니다. 아래 코드와 같이 객체 목록을 반환합니다.NHibernate에 : 나는 <em>ICriteria의</em>을 구성하고 함수에 그에 전달하려는 세션

오브젝트 목록을 수집하기 위해 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을 사용하여 쿼리를 실행할 수 있습니다." 그것 실제로 너무 쉽게, 나는 이것을 요구하는 것을 부끄럽게 생각해야한다! 나는 Detached Criteria를 알지 못했다. 포인터 주셔서 감사. –

관련 문제