我有一个包含大约 50,000 行的数据表,我正在使用 DataTable.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));
如果您想从结果创建一个新的 DataTable,请使用 CopyToDataTable
,使用 ToArray
创建一个 DataRow[]
或保留它并使用foreach
在不创建新集合的情况下枚举结果。
关于c# - 具有多个 AND 条件的 DataTable 选择实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16219521/