gpt4 book ai didi

.net - DataView.RowFilter 与 DataTable.Select() 与 DataTable.Rows.Find()

转载 作者:行者123 更新时间:2023-12-03 08:51:48 25 4
gpt4 key购买 nike

考虑下面的代码:

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

谷歌搜索这个主题我发现一些文章/论坛主题提到 Datatable.Select() 本身有很多错误(对此不确定)并且在各种情况下表现不佳。

在 msdn 上的这个( Best Practices ADO.NET)主题上,建议如果在数据表上定义了主键,则应使用 findrows() 或 find() 方法代替 Datatable.Select()。

本文 here (.NET 1.1) 对所有三种方法以及更多方法进行了基准测试。但这是针对 1.1 版的,所以不确定这些现在是否仍然有效。根据此 DataRowCollection.Find() 优于所有方法,Datatable.Select() 优于 DataView.RowFilter。

所以我很困惑在数据表中查找行的最佳方法可能是什么。或者没有单一的好方法可以做到这一点,根据场景存在多种解决方案?

最佳答案

Thomashaid 的帖子很好地总结了这一点:

  • DataView.RowFilter用于绑定(bind)。
  • DataTable.Rows.Find仅用于按主键搜索。
  • DataTable.Select用于按多列搜索,也用于指定顺序。

  • 避免在循环中创建许多 DataView 并使用它们的 RowFilters 来搜索记录。这将大大降低性能。

    我想补充一下 DataTable.Select可以利用索引。您可以通过创建 DataView 并指定排序顺序在 DataTable 上创建索引:
    DataView dv = new DataView(dt);
    dv.Sort = "Col1, Col2";

    然后,当您调用 DataTable.Select() ,它可以在运行查询时使用该索引。在我们多次使用相同查询的地方,我们已经使用这种技术来显着提高性能。 (请注意,这是在 Linq 存在之前。)

    诀窍是为 Select 正确定义排序顺序。陈述。因此,如果您的查询是“Col1 = 1 和 Col2 = 4”,那么您将需要“Col1,Col2”,如上例所示。

    请注意,索引创建可能取决于创建 DataView 的实际调用。我们不得不使用 new DataView(DataTable dt)构造函数,然后在单独的步骤中指定 Sort 属性。不同的 .NET 版本的行为可能会略有不同。

    关于.net - DataView.RowFilter 与 DataTable.Select() 与 DataTable.Rows.Find(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2832304/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com