.net – DataView.RowFilter Vs DataTable.Select()vs DataTable.Rows.Find()

考虑下面的代码:

Dataview someView = new DataView(sometable)
someView.RowFilter = someFilter;

if(someView.count > 0) {  …. }

Datatable.Select()的数据量相当于使用DataViews的数量,但这些都在VS2008之前。

Solved: The Mystery of DataView’s Poor Performance with Large Recordsets
Array of DataRecord vs. DataView: A Dramatic Difference in Performance

关于这个主题的Google搜索我发现一些文章/论坛主题,其中提到Datatable.Select()本身是非常错误的(不确定),在各种情况下表现不佳。

在关于msdn的这个(Best Practices ADO.NET)主题上,建议如果在datatable上定义了主键,则应该使用findrows()或find()方法来设置Datatable.Select()。

这篇文章here(.NET 1.1)基准测试了所有这三种方法加上几个。但是这是1.1版,所以不知道这些是否仍然有效。加入此DataRowCollection.Find()优于所有方法,Datatable.Select()优于DataView.RowFilter。

所以我对在数据表中查找行的最佳方法感到困惑。或者没有一个好的方法来做到这一点,根据场景有多种解决方案存在?

Aseem,

你正在寻找“在数据表中找到行的最佳方法”,所以我首先要问:“最好的”是什么?我认为,任何技术都有可能比其他技术更适合的场景。

首先,我们来看看DataView.RowFilter:DataView在数据绑定中有一些优势。它非常面向视图,因此它具有强大的排序,筛选或搜索功能,但会产生一些开销,并未针对性能进行优化。我会选择DataView.RowFilter用于较小的记录集和/或您利用其他功能(如直接数据绑定到视图)。

关于DataView的大多数事实,您可以在旧帖子中阅读,仍然适用。

其次,如果您只想单击,您应该更喜欢DataTable.Rows.Find over DataTable.Select。为什么? DataTable.Rows.Find只返回一行。基本上,当您指定主键时,将创建一个二叉树。这与它有一些开销,但是极大地加快了检索速度。

DataTable.Select更慢,但是如果您有多个条件,并且不关心索引或未索引的行,则可以非常方便:它可以基本找到所有内容,但未针对性能进行优化。本质上,DataTable.Select必须遍历整个表,并将每个记录与您传入的条件进行比较。

我希望你发现这个小概述有帮助。

我建议看看this article,这对我来说有关性能问题有帮助。这篇文章包含一些引号。

一点点更新:
顺便说一下,这可能看起来有点超出你的问题,但它几乎总是在后端进行过滤和搜索的最快的解决方案。如果您想要简单,并且有一个SQL Server作为后端和客户端上的.NET3,请转到LINQ to SQL。搜索Linq对象非常舒适,并创建在服务器端执行的查询。虽然LINQ对对象也是一个非常舒适但也较慢的技术。如果你不知道….

最好的祝福,
托马斯

http://stackoverflow.com/questions/2832304/dataview-rowfilter-vs-datatable-select-vs-datatable-rows-find

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:.net – DataView.RowFilter Vs DataTable.Select()vs DataTable.Rows.Find()