2011-04-18 5 views
0

나는 ID의 목록을 가지고 있으며 모든 행을 하나의 쿼리로 되돌리고 싶습니다. 개체 목록 (제품 목록 등). 이 모든 작업을 한 번에 수행 할 수 있습니까? Nhibernate

나는
public List<TableA> MyMethod(List<string> keys) 
{ 
    var query = "SELECT * FROM TableA WHERE Keys IN (:keys)"; 
    var a = session.CreateQuery(query).SetParameter("keys", keys).List(); 
    return a; // a is a IList but not of TableA. So what do I do now? 
} 

을 시도하지만 개체의 목록으로 반환하는 방법을 알아낼 수 없습니다. 이것이 올바른 방법일까요?

답변

1
List<TableA> result = session.CreateQuery(query) 
          .SetParameterList("keys", keys) 
          .List<TableA>(); 
+0

@binaryhowl을 같은 것을 할 - 그것은 IList의 날을 다시주고 내가 아닌 목록 그렇게 할 때. – chobo2

+0

@binaryhowl - 목록에 캐스트 (목록 ) 가야할지 모르겠지만 실행할 때이 오류가 발생합니다. 'Antlr.Runtime.NoViableAltException'유형의 예외가 발생했습니다. 1 행 7 열 근처 – chobo2

+0

구체 목록 을 원하면 result.ToList()를 반환하십시오. 가장 좋은 방법은 IEnumerable 또는 적어도 IList를 반환하는 메서드를 변경하는 것이지만 rebelliard

0

이의 번호가있는 경우이 쿼리에 제한이 될 수 Howeever "키는"1000 개 이상의 (넣다 다른 DBS와 확실하지 오라클의)를 초과 그래서 내가 대신 CreateQuery- 네이티브 SQL을의 ICriteria를 사용하는 것이 좋습니다 .

[TestFixture] 
    public class ThousandIdsNHibernateQuery 
    { 
     [Test] 
     public void TestThousandIdsNHibernateQuery() 
     { 
      //Keys contains 1000 ids not included here. 
      var keys = new List<decimal>(); 

      using (ISession session = new Session()) 
      { 
       var tableCirt = session.CreateCriteria(typeof(TableA)); 


       if (keys.Count > 1000) 
       { 
        var listsList = new List<List<decimal>>(); 

        //Get first 1000. 
        var first1000List = keys.GetRange(0, 1000); 

        //Split next keys into 1000 chuncks. 
        for (int i = 1000; i < keys.Count; i++) 
        { 
         if ((i + 1)%1000 == 0) 
         { 
          var newList = new List<decimal>(); 
          newList.AddRange(keys.GetRange(i - 999, 1000)); 
          listsList.Add(newList); 
         } 

        } 

        ICriterion firstExp = Expression.In("Key", first1000List); 
        ICriterion postExp = null; 

        foreach (var list in listsList) 
        { 
         postExp = Expression.In("Key", list); 
         tableCirt.Add(Expression.Or(firstExp, postExp)); 
         firstExp = postExp; 

        } 

        tableCirt.Add(postExp); 
       } 
       else 
       { 
        tableCirt.Add(Expression.In("key", keys)); 

       } 

       var results = tableCirt.List<TableA>(); 
      } 

     } 
    } 
관련 문제