具有多个 AND 条件的 DataTable 选择实现

Dav*_*veH 4 c# datatable performance select

我有一个包含大约 50,000 行的 DataTable,我用它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 + "*'");  
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有办法始终使操作按从左到右的顺序SELECT评估条件,以便减少步骤之间搜索的记录数量?AND看来这可以很好地节省时间。谢谢你的想法。

Tim*_*ter 5

您可以使用Linq(请注意,最慢的条件是最后一个):

IEnumerable<DataRow> rows = myDataTable.AsEnumerable()
    .Where(r => r.Field<string>("Field2") == term2
            &&  r.Field<string>("Field3") == term3
            &&  r.Field<string>("Field1").Contains(term1));
Run Code Online (Sandbox Code Playgroud)

如果CopyToDataTable要从结果创建新的 DataTable,ToArray请使用它来创建DataRow[]或保留它并用于foreach枚举结果而不创建新集合。