我有以下代码。有时需要花费更长的时间才能执行此代码。 需要改进代码。
//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()。
答案 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;
}
}