DataView.RowFilter 與 DataTable.Select() 與 DataTable.Rows.Find()
考慮下面的程式碼:
Dataview someView = new DataView(sometable) someView.RowFilter = someFilter; if(someView.count > 0) { …. }相當多的文章說 Datatable.Select() 比使用 DataViews 更好,但這些都是在 VS2008 之前。
已解決: DataRecord 與 DataView 的大型記錄集數組的 DataView 性能不佳之謎:性能上的巨大差異
Google搜尋這個主題我發現一些文章/論壇主題提到 Datatable.Select() 本身有很多錯誤(對此不確定)並且在各種情況下表現不佳。
在 msdn 上的這個(Best Practices ADO.NET)主題上,建議如果在數據表上定義了主鍵,則應使用 findrows() 或 find() 方法代替 Datatable.Select()。
此處的這篇文章(.NET 1.1) 對所有三種方法以及更多方法進行了基準測試。但這是針對 1.1 版的,所以不確定這些現在是否仍然有效。根據此 DataRowCollection.Find() 優於所有方法,Datatable.Select() 優於 DataView.RowFilter。
所以我很困惑在數據表中查找行的最佳方法可能是什麼。或者沒有單一的好方法可以做到這一點,根據場景存在多種解決方案?
您正在尋找“在數據表中查找行的最佳方法”,所以我首先要問:“最佳”是為了什麼?我認為,任何技術都有可能比其他技術更適合的場景。
首先,讓我們看一下
DataView.RowFilter:DataView 在數據綁定方面有一些優勢。它非常面向視圖,因此它具有強大的排序、過濾或搜尋功能,但會產生一些成本並且未針對性能進行優化。我會選擇DataView.RowFilter較小的記錄集和/或您利用其他功能的地方(例如,直接數據綁定到視圖)。您可以在較早的文章中閱讀有關 DataView 的大多數事實仍然適用。
其次,如果你只想要一次點擊
DataTable.Rows.Find,你應該更喜歡。DataTable.Select為什麼?DataTable.Rows.Find 只返回一行。本質上,當您指定主鍵時,會創建一個二叉樹。這有一些與之相關的成本,但極大地加快了檢索速度。
DataTable.Select速度較慢,但如果您有多個條件並且不關心索引或未索引的行,它會非常方便:它基本上可以找到所有內容,但沒有針對性能進行優化。本質上,DataTable.Select 必須遍歷整個表並將每條記錄與您傳入的條件進行比較。我希望這個小概述對您有所幫助。
我建議看看**這篇文章**,它對我的性能問題很有幫助。這篇文章包含了一些引用。
一點更新: 順便說一句,這似乎有點超出您的問題範圍,但它幾乎總是在後端進行過濾和搜尋的最快解決方案。如果您想要簡單性並且將SQL Server作為後端並在客戶端使用 .NET3+,請選擇 LINQ-to-SQL。搜尋 Linq 對象非常舒適,並且會創建在伺服器端執行的查詢。雖然 LINQ-to-Objects 也是一種非常舒適但速度較慢的技術。如果你還不知道……