哪个更快,为每个类别获取Count()或从数据集查询以及如何执行此操作

时间:2016-03-06 05:48:17

标签: c# sql asp.net

我目前正在尝试获取每个类别(特定ID)中的文章数量,以便在类别名称旁边显示它。这就是categories

的样子

现在我正在尝试将带有count的标签控件分配给各个类别。我有两个选项,通过在每个类别下运行6次以下选择查询并分配它。

Select Count(Cat) from tbl_blg where Cat ='1' //should do so for all the 6 ID's 

SqlCommand cmdcount = new SqlCommand("SELECT Cat from tbl_blg",cnn);
        SqlDataAdapter dacount = new SqlDataAdapter(cmdcount);
        dacount.Fill(dscount);

        int scount = Convert.ToInt32(dscount.Tables["tbl_blg"].AsEnumerable().Count(r => r.Field<int>("Cat") == 1));

现在,第一个将是乏味的(一次性6个查询),我相信,如果我错了,请纠正我。

第二个会更好(只有一个查询并将其分配给数据集) 但问题是它返回null并抛出null异常......

您认为哪一个更快?如果它是第二个选项那么我的代码是否正确?它返回null但应返回2

2 个答案:

答案 0 :(得分:0)

将您的第二个查询重写为。

SELECT COUNT(Cat) as Count, Cat FROM tbl_blg
Group by Cat

给出每个类别存在多少的计数。 你现在正在做的是从该表中选择所有内容然后进行计数。通过在查询级别上执行分组,您可以限制检索的结果数量。

当前查询检索;

Cat1 
Cat1 
Cat1 
Cat1 
Cat2

使用group by语句检索;

4, Cat1
1, Cat2

对于这种情况,进行多次查询基本上是不行的。此外,EF总是在您的请求上增加一些开销,因此当它对性能至关重要时,您可以考虑使用一些更低级的ORM,如Dapper或开始使用SQL /存储过程。

答案 1 :(得分:0)

您也可以使用窗口功能。

SELECT COUNT() OVER(PARTITION BY cat ORDER BY cat) AS 'Count'
FROM tbl_blg

此外,如果您要不断调用此代码,我强烈建议将其作为存储过程。存储过程的好处是你的sql server不必每次都重新编译代码。