我正在使用一个包含大约 50,000 行的 DataTableDataTable.Select
从中检索行。这Select
需要多个AND
条件包括通配符匹配。我玩过并发现通过做同样的事情Select
多步执行可以大大减少执行时间,但是改变一下执行顺序AND
声明不影响它。
//This takes ~ 750 ms
DataRow[] results = myDataTable.Select("Field1 LIKE '*" + term1 + "*'" +
"AND Field2 = '" + term2 + "'" +
"AND Field3 = '" + term3 + "'");
//This also takes ~750 ms
DataRow[] results2 = myDataTable.Select("Field3 = '" + term3 + "'" +
"AND Field2 = '" + term2 + "'" +
"AND Field1 LIKE '*" + term1 + "*'");
//This takes 0.415 ms
DataTable table1 = myDataTable.Select("Field3 = '" + term3+ "'").CopyToDataTable();
DataTable table2 = table1.Select("Field2 = '" + term2 + "'").CopyToDataTable();
DataRow [] results3 = table2.Select("Field1 LIKE '*" + term1 + "*'");
我的问题是,有没有办法始终使SELECT
操作评估AND
按从左到右的顺序排列条件,以便减少步骤之间搜索的记录数量?看来这可以很好地节省时间。谢谢你的想法。
你可以使用Linq
(请注意,最慢的条件是最后一个):
IEnumerable<DataRow> rows = myDataTable.AsEnumerable()
.Where(r => r.Field<string>("Field2") == term2
&& r.Field<string>("Field3") == term3
&& r.Field<string>("Field1").Contains(term1));
Use CopyToDataTable
如果你想从结果创建一个新的数据表,ToArray
创建一个DataRow[]
或者留下它并使用foreach
枚举结果而不创建新集合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)