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

我有一个大约有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 + "*'"); 

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

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

 IEnumerable rows = myDataTable.AsEnumerable() .Where(r => r.Field("Field2") == term2 && r.Field("Field3") == term3 && r.Field("Field1").Contains(term1)); 

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

没有..数据表一行一行地选择。

您可以将代码编写得更短:

 DataRow [] results = myDataTable .Select("Field3 = '" + term3+ "'").CopyToDataTable() .Select("Field2 = '" + term2 + "'").CopyToDataTable() .Select("Field1 LIKE '*" + term1 + "*'"); 

或者……如果你做了一个额外的扩展方法,像这样:

static public DataRow []选择(此IEnumerable行,字符串filter){return rows.CopyToDataTable()。选择(filter); }

使用此扩展程序可使您的代码更短:

 DataRow [] results = myDataTable .Select("Field3 = '" + term3+ "'") .Select("Field2 = '" + term2 + "'") .Select("Field1 LIKE '*" + term1 + "*'"); 

要么:

 static public DataRow[] Select(this DataTable dt, string firstFilter, params string[] filters) { DataRow[] result = dt.Select(firstFilter); foreach(string filter in filters) result = result.CopyToDataTable().Select(filter); return result; } 

开辟道路:

 DataRow [] results = myDataTable.Select( "Field3 = '" + term3+ "'", "Field2 = '" + term2 + "'", "Field1 LIKE '*" + term1 + "*'");