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

标签 c# performance select datatable

我有一个包含大约 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/

相关文章:

c# - 如何访问通用定义对象的属性?

C++ Pthreads - 多线程比单线程慢

c# - 如何使 XML 反序列化更快?

mysql - 选择上周内的日期,但不仅限于过去 7 天

c# - 分配给方法的 ref 参数是原子操作吗?

c# - VS2008 C# 编译器错误 : "' . ctor' is not supported by the language”

mysql - 寻找从未订购过意大利辣香肠披萨的顾客

javascript - 获取第一个单词和换行符之间的内容

c# - WPF - 将位图转换为图像源

algorithm - 找到方法测试矩阵(数学问题)解释的有效方法