2011-04-18 38 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 2011-04-18 23:12:40

+0

@binaryhowl - 我做了一個強制轉換到列表(列表)不確定是否要這樣做,但我嘗試運行時遇到此錯誤 - 拋出了類型爲'Antlr.Runtime.NoViableAltException'的異常。靠近第1行第7列 – chobo2 2011-04-18 23:19:00

+0

如果你想要一個具體的列表,只要返回result.ToList(),儘管最好的方法是讓你改變方法返回IEnumerable 或至少IList rebelliard 2011-04-18 23:31:57

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

     } 
    } 
相關問題