2014-10-27 46 views
1

我仍在學習,並試圖使我的代碼更好,所以我決定使用接口和泛型來使我的CRUD代碼更好。NHibernate在sql搜索中使用.where()條件或以後使用LINQ?

到目前爲止,我已經爲我的數據庫中的每張表做了大量的回購。現在我試圖通過使用公共存儲庫來減少這個數量。

問題是,我的一些存儲庫要求使用比簡單SELECT更具體的條件進行搜索。

例如:

///<summary> 
///Get handle for stanowisko where user defined that it should be used to count time of work for this machine 
///</summary> 
public HandleCzujnikiModel Select(string stanowisko, bool doObliczeniaCzasuPracy) 
{ 
    using (ISession session = NHibernateHelper.OpenSession()) 
    { 

     return obj = session.Query<HandleCzujnikiModel>() 
      .Where(c => c.Stanowisko == stanowisko && c.DoObliczeniaCzasuPracy == doObliczeniaCzasuPracy).FirstOrDefault(); 

    } 
} 

NHibernate的將創建一個SQL出於此。

現在我的問題是,我做了很多存儲庫,在我的存儲庫後繼承,我保持共同的SELECT,UPDATE等等,並有更多特定操作的額外方法。

還是我使用簡單的SELECT和後來使用LINQ服務器端來獲得我想要的結果。

我認爲這兩種解決方案都有其優點和缺點。

1)如果只使用,,主「庫我可以大幅減少類的數量 2)然而,這可能會導致更糟糕的表現?因爲我必須從數據庫中選擇更多的記錄和什麼更多使用額外的代碼。使用LINQ。凡條款,得到的結果

現在我的知識是有限的,因此我不得不尋求從StackOverflow的神:)

乾杯答案

+2

你有沒有想過使用查詢模式?查看Ayende的博客文章http://ayende.com/blog/3955/repository-is-the-new-singleton)並查看關於查詢模式的評論。 – 2014-10-27 08:38:50

+1

允許存儲庫的消費者提供'IQueryable'表達式樹(例如GenericRepository)的選項是一個[激烈爭論的問題](http://programmers.stackexchange.com/questions/192044/should-repositories-return-iqueryable ) - 它的支持者會說表達式樹是標準/規範模式的可接受表示,而批評者則會證明泄漏封裝和無法充分測試使用情況。 – StuartLC 2014-10-27 08:44:25

回答

1

作爲一個經驗法則:如果你能對數據庫進行過濾,在那裏做。

這意味着你的情況:如果你可以生成一個NHibernate查詢,那麼在NHibernate查詢中進行過濾要比獲取所有行並在之後使用Linq進行過濾要好得多。

如果你沒有很多行,或者你使用的是本地開發數據庫,​​這似乎不是什麼大不了的事情,但是如果到數據庫的連接很慢(呃),並且你有很多數據庫中的行將顯示將所有行發送到客戶端所需的性能。

我們經歷過的另一件事:你的NHibernate對象越來越複雜(來自其他表的字段)這個問題變得越來越糟。

最有可能你是goint如果你設計你的應用程序這樣的體驗到N + 1個問題: What is SELECT N+1?

+0

其實我有兩點:1)有成千上萬條記錄的表格,可能隨着時間變得更大2)表格最多有100條記錄,可能不會變大。根據你的回答我想最好的做法是在NHibernate中使用大量記錄的大表的條件,併爲小表使用LINQ?在我們項目中的大多數情況下,我們將使用本地數據庫(Intranet中的MVC應用程序) – 2014-10-27 08:58:11

+0

不,我認爲無論數據庫大小如何,直接在數據庫上進行篩選都會更好。但是你將會在大桌面上體驗到更糟的效果。 – bernhardrusch 2014-10-27 09:51:24