我目前正在尝试获取每个类别(特定ID)中的文章数量,以便在类别名称旁边显示它。这就是
的样子现在我正在尝试将带有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
答案 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不必每次都重新编译代码。