在DataTable对象上运行许多动态SQL查询是否可行

时间:2015-05-22 21:21:07

标签: c# performance datatable dataview rowfilter

一个DataTable对象,比如股票(Ticker,Sector,Price) 我想支持动态查询(即在编译时不知道) 像这样的“Ticker喜欢'%A',价格> 7.50”

我理解DataView.RowFilter支持某种程度的SQL表达式 但问题是你每次设置.RowFilter时,DataView都会重建内部索引,而且开销太大了

我尝试不查询SQL Server,因为 1)它是一个小数据集,在运行时没有太大变化,因此可以在内存中 2)我想评估成千上万的这些自由格式的SQL表达式

我有哪些选择?谢谢!

更新

DataTable.Select的Thx jp2code

我尚未验证,但此链接http://www.codeproject.com/Tips/807941/DataTable-Select-is-Slow
说构建一个DataView会创建一个似乎对DataTable.Select产生有利影响的索引,所以我只将所有数据存储在一个DataTable对象中,并为每个将参与查询的列创建一个DataView。

1 个答案:

答案 0 :(得分:0)

在下面调用 GetData(table),然后每隔一次调用重载 GetData(table,sqlFilter)

    private DataTable m_table;

    public DataTable GetData(string sqlCmd)
    {
        DataTable table = new DataTable();
        return table;
    }

    public DataTable GetData(DataTable table, string sqlFilter)
    {
        if (!String.IsNullOrEmpty(sqlFilter))
        {
            var copy = table.Clone();
            foreach (DataRow row in table.Select(sqlFilter))
            {
                var newRow = copy.NewRow();
                for (int i = 0; i < row.ItemArray.Length; i++)
                {
                    newRow[i] = row.ItemArray[i];
                }
                copy.Rows.Add(newRow);
            }
            return copy;
        }
        return table;
    }

可能还有其他方法,但这应该让你开始。