如何检测linq中不存在的行?

时间:2011-11-10 12:40:14

标签: c# linq tsql

我有一个与此类似的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以使其易于理解

这应该是非常微不足道的,但我无法以某种方式得到它。

3 个答案:

答案 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; 
相关问题