有没有比Compute更快的方法来在DataTable中执行查询数据?

时间:2013-10-03 19:08:46

标签: c# datatable

我目前正在使用与此类似的函数计算几列数据。

DataTable data = RetrieveDataTable();
var value = data.Compute(
    "AVG(Important_Variable)", 
    "(Distance > 1230 and Distance < 1760) OR (Distance > 4710 and Distance < 5400)"
);

这很有效,但速度很慢。有没有更快的方法来实现同样的事情?不同的数据类型是完全可以的,我没有与DataTables结婚。

2 个答案:

答案 0 :(得分:2)

我不知道你是如何填充你的DataTable的,但我刚刚想到的一种方法是在填充DataTable时累积元素的总和和数量(你需要计算平均值) 。如下所示:

int sum;
int count;

for(something) //Loop that populates the data table
{
   .
   .
   var Important_Variable = Read something
   Populate(Important_Variable)
   count++;
   if((Distance > 1230 and Distance < 1760) || (Distance > 4710 and Distance < 5400))
      sum += Important_Variable;
   .
   .
}
var avg = sum/count;

这样你就不必在事后运行过滤器(我很确定这是一个耗时的部分)。

答案 1 :(得分:1)

  1. 将所有内容映射到POCO对象。
  2. 写一个(只读)获取属性......进行计算。
  3. 这是一个~basic~ORM映射器(Aka,创建你的POCO)

    Why is DataTable faster than DataReader

    使用对象的其他属性的readonly(get; only)属性。

    如果你的计算是“昂贵的”,并且你读了不止一次,你可以使用这个“可空”的技巧。

    public class Employee
    {
    
        public DateTime BirthDate { get; set; }
        public DateTime HireDate { get; set; }
    
        TimeSpan? _difference = null;
        public TimeSpan Difference
        {
            get
            {
                TimeSpan returnValue;
                if (this._difference.HasValue)
                {
                    returnValue = this._difference.Value;
                }
                else
                {
                       /* COSTLY CALCULATION HERE , ONE TIME */
                    this._difference = this.HireDate.Subtract(this.BirthDate);
                       /* End COSTLY Calculation */
    
                    returnValue = this._difference.Value;
                }
                return returnValue;
            }
        }
    
    }