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,请使用CopyToDataTable
, ToArray
创建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 + "*'");