2009-11-26 75 views
0

我用Castle ActiveRecord作爲我的持久化層。種姓的ActiveRecord - LINQ優化查詢

我得到這個職能,必須從數據庫返回的前20位用戶。

IList<User> users = new List<User>(); 

var userQuery = from u in User.FindAll() 
       orderby u.CreationDate 
       select u; 

return userQuery.Take(20).ToList(); 

在我的數據庫,我現在有100個用戶,我只希望我的查詢返回20個用戶,而不是100

當監控做什麼用log4net的發生,筆者看到,查詢首先得到100用戶和之後,只有20個第一。

我想知道這是否是一個有這樣做的更好的方法。因爲更多的用戶,我會擁有,更多的我的查詢將是緩慢的,而不是優化...

+0

我假設你在這裏看到的查詢是第一隻檢索ID的查詢,然後將查詢得到20個單位? 你可以發佈來自log4net的查詢嗎? – 2009-11-27 03:55:14

回答

3

這是什麼情況..

  1. 方法User.FindAll()返回的所有用戶的陣列。 (來自DB的100行)
  2. 然後您訂購併過濾相同的數組。

隨着AR 2.0可以使用ActiveRecordLinqBase代替ActiveRecordBase和使用.Queryable,而是如果.FindAll()。

這個查詢將返回數據庫只有20個記錄..

var userQuery = (from u in User.Queryable 
       orderby u.CreationDate 
       select u).Take(20).ToList(); 
+0

這似乎正是我想要的!但是現在,我得到了這個錯誤:System.ObjectDisposedException:Session關閉了!任何想法我怎麼能解決這個問題? – Melursus 2009-11-27 16:53:49

+0

你在會話範圍內運行你的查詢嗎? 當使用ActiveRecord.Linq時,需要SessionScope。 使用(新SessionScope()){你的LINQ代碼...} – 2009-11-27 19:14:12

+0

有沒有一種方法來定義某種默認SessionScope的?因爲我不太喜歡這個想法,所以我把所有的linq代碼都用上了。 – Melursus 2009-11-27 19:52:54