我有一个与此类似的tsql代码段:
select p.Make, count(p.Make) as _count
from Products p
where p.GroupId = @GroupId
group by p.Make
完整的结果集将是5行:
Make _count
``````````````
Make1 32
Make2 54
Make3 60
Make4 09
Make5 47
在C#中,我正在尝试计算每个品牌的百分比(假设我已经知道总产品)所以我可以构建一个谷歌图像图表(饼图),所以我需要在那里传递5个值。
我想这样做:
int Make1Count = from row in DataSetProducts.tables[0].AsEnumerable()
where row.Field<string>("Make") == MyEnum.Makers.Make1.ToString()
select row.Field<int>("_count");
以及Make5Count等等。理想情况下,我应该有5个结果,但情况并非总是如此,有时结果是这样的:
Make _count
``````````````
Make1 32
Make4 09
Make5 47
但我仍然需要Make2和3(它们只是零)
我的问题是,例如,当找不到Make2时,此代码会抛出异常。 我该如何避免这种情况?
注意1)在我的数据库中,没有所有制造商的清单,所以我无法将其与任何东西合并
注2)在这里,我在from row in ...
之前避免使用Convert.toInt32以使其易于理解
这应该是非常微不足道的,但我无法以某种方式得到它。
答案 0 :(得分:3)
首先,看起来您正在尝试选择一行(来自您的sql和linq示例),但您的linq会返回多行..相反,试试这个:
int Make1Count = (from row in DataSetProducts.tables[0].AsEnumerable()
where row.Field<string>("Make") == MyEnum.Makers.Make1.ToString()
select row.Field<int>("_count"))
.SingleOrDefault();
那应该返回一行,并解决一个问题。
现在,对于您的真正问题,当某些行不存在时,SingleOrDefault()
将返回数据类型的默认值,请对此进行检查。例如,int的默认值为0,这是您想要的,bool的默认值为false等
答案 1 :(得分:0)
将您的sql更改为以下内容 选择X.Make,count(X.Make)
(
(选择p.Make,计数(p.Make)为_count 来自产品p 其中p.GroupId = @GroupId p.Make)t1
联合 选择'Make1',0
联合 选择'Make2',0
联合 选择'Make3',0
联合 选择'Make4',0
联合 选择'Make5',0 )
X
分组由X.Make
答案 2 :(得分:0)
怎么样,
var counts = DataSetProducts.tables[0].Select(row =>
make = row.Field<string>("Make"),
count = row.Field<int>("_count"));
int Make1Count = counts.SingleOrDefault(c =>
c.make == MyEnum.Makers.Make1.ToString()).count;