c#的性能差异

时间:2017-05-10 11:18:47

标签: c# asp.net performance

我有以下代码。有时需要花费更长的时间才能执行此代码。 需要改进代码。

//Get products from DB
DataTable dtProducts = GetAllProducts();

if(dtProducts !=null && dtProducts.Rows.Count >0)
{

dtProducts .DefaultView.RowFilter = null;
dtProducts .DefaultView.RowFilter = " product_id = '" +product_id.Trim() + "'";

DataTable dtProductCount = dtProducts .DefaultView.ToTable();

       if (dtProductCount != null && dtProductCount.Rows.Count > 0)
       {
           object obj = dtProductCount.Compute("SUM(qty)", "");
           if (!Convert.IsDBNull(obj))
           {
              int qtyProd = Convert.ToInt32(obj);
           }
       }

}

这里是否有任何性能改进的范围? 与计数相反,我们可以在数据表中使用 Any()

2 个答案:

答案 0 :(得分:1)

一个明确的改进是在WHERE子句中的SQL查询本身中包含过滤条件select * from products where product_id = @product_id ,从而只返回所需的数据集而不是所有内容

for loop

根据您的评论因为此代码在我获得产品ID 的每个循环内运行...然后从product_id收集所有1,2,34,.....并创建像IN这样的列表然后仅使用<com.github.florent37.arclayout.ArcLayout android:layout_width="match_parent" android:layout_height="200dp" app:arc_cropDirection="cropInside" app:arc_height="90dp" app:arc_padding="30dp" android:elevation="5dp" > <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:src="@drawable/yourImage" /> </com.github.florent37.arclayout.ArcLayout> 运算符在您的查询中使用它。

答案 1 :(得分:1)

数据库本身专门用于数据聚合,因此您可以为它提供该作业:

public DataTable GetProductQuantitySummary(int? productId)
{
    using (var cn = new SqlConnection("...."))
    using (var cm = new SqlCommand   ("", cn))
    {
        cn.Open();
        cm.CommandText = @"
            SELECT   product_id, SUM(qty) SumQty
            FROM     Products
            WHERE    product_id = @product_id OR @product_id IS NULL
            GROUP BY product_id";
        cm.Parameters.AddWithValue("@product_id", (object) productId ?? DBNull.Value);

        var table = new DataTable();
        using (var reader = cm.ExecuteReader())
        {
            table.Load(reader);
        }
        return table;
    }
}

这样,您只会返回所需的数据。

如果您希望调用此方法始终通过productId,则根本不需要返回DataTable,您可以返回结果:

public int GetProductQuantitySummary(int productId)
{
    using (var cn = new SqlConnection("..."))
    using (var cm = new SqlCommand("", cn))
    {
        cn.Open();
        cm.CommandText = @"
            SELECT   SUM(qty) SumQty
            FROM     Products
            WHERE    product_id = @product_id";
        cm.Parameters.AddWithValue("@product_id", productId);

        return cm.ExecuteScalar() as int? ?? 0;
    }
}