如何检测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 ...
之前,以保持它的可理解性
首先,看起来您正在尝试选择一行(从您的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)
Xvar 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;