如何检测linq中不存在的行

本文关键字:不存在 linq 何检测 检测 | 更新日期: 2023-09-27 18:14:20

我有一个类似于这样的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#中,我试图计算每个make的百分比(假设我已经知道总产品),所以我可以构建一个谷歌图像图表(饼),所以我需要在那里传递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(它们都是0)

我的问题是,当没有找到Make2时,这段代码会抛出一个异常。请问我该如何避免这种情况?

注1)在我的数据库中,没有所有制造商的列表,所以我不能真正合并它与任何

注2)在这里,我避免了Convert。toInt32在from row in ...之前,以保持它的可理解性

如何检测linq中不存在的行

首先,看起来您正在尝试选择一行(从您的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等

将SQL更改为以下内容select X.Make, count(X.Make)

(

(select p. make, count(p. make))为_count来自《产品》where p.GroupId = @GroupIdmake) t1

联盟

联盟选择'Make2', 0

联盟select 'Make3', 0

联盟select 'Make4', 0

联盟选择'Make5', 0)

X

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;