2013-03-09 61 views
2

我建立一個信息庫層爲我的MVC應用程序與像GetObject的,UpdateObject,DeleteObject的方法等使用IQueryables正確實施存儲庫模式?

這是我現在有:

 public List<Object> GetObjects() 
     { 
      return _db.Objects.Where(o => o.IsArchived == false).ToList(); 
     } 

但它是否會我想知道最好是爲列表返回IQueryable,以便在UoW或Service層中應用過濾器時將最少量的數據發送到客戶端。最好是做這樣的事情嗎?

  public IQueryable<Object> GetObjects() 
      { 
       return _db.Objects.Where(o => o.IsArchived == false); 
      } 
+0

是的,這樣做,那麼你可以鏈接你的查詢 – Jasen 2013-03-10 00:43:45

+0

你使用實體框架來與數據庫交互是嗎? – gdp 2013-03-10 07:59:45

回答

0

返回IQueryable的不好之處在於,如果您有不同的存儲庫實現,比如說使用不同的ORM,將數據存儲在非SQL數據庫,雲或XML文件中,則很難實現相同的接口。如果你返回更多的域對象的通用集合,實現起來會容易得多。例如IEnumerable。你總是可以通過過濾標準。

返回IQueryable的另一個缺點是,它可能發生,當你真正運行查詢時,你的對象上下文可能已經被處理了(取決於你的實現)還是可能被保存在內存比需要的時間長。

像IQueryable這樣的泄漏抽象可能會導致問題,例如想象您想從數據庫獲取一些數據並按Guid進行排序。如果在排序之前通過調用ToList()來枚舉查詢,那麼如果您在之後執行此操作,則會得到不同的結果。原因是在第一種情況下,排序將在.NET中發生,但在其他情況下,它將在使用完全不同順序的SQL中發生。

0

這裏返回IQueryable的好處是您可以繼續構建您的查詢,而無需點擊數據庫。一旦你打電話給ToList,它會打到分貝,你不能再次定製你的查詢,而無需再次敲擊數據庫。