linq count returns 0 如果按列分组为 0
linq count returns 0 if the group by column is 0
我有一个 LINQ 查询,它适用于除位置为 0 之外的所有内容,我想要计算有多少,Inventory = locGroup.Count
行 returns 0。所有其他计数当位置为 0 时,函数工作正常,而当位置不为 0 时,Inventory = locGroup.Count
工作正常。据我所知,你不能在 VS 中调试 LINQ 语句,所以我不确定为什么或如何这不起作用。
不确定如何在 SO 上显示此表格数据
IMLOCN |英普利克 |很特别 | veh评论 |图片 |年龄
50----------------5------------0----------------Y ------------------21--------100
50----------------5.8------------1----------------Y-- --------------23--------200
0----------------2------------0-------------- -N----------------0--------5
0----------------4------------0------------ -N----------------0--------10
预期输出
50 -- 2 -- 2 -- 1 -- 2 -- 2 -- 300
0 -- 2* -- 2 -- 0 -- 0 -- 0 -- 15 *实际结果是0,但其他#保持不变。
Dim summaryInfo = From p In infoTable
Group p By Location = p.Field(Of Byte)("IMLOCN") Into locGroup = Group
Select New With {
Key locGroup,
.Location = locGroup.Max(Function(r) r.Field(Of Byte)("IMLOCN")),
.Inventory = locGroup.Count(Function(r) r.Field(Of Byte)("IMLOCN")),
.Priced = locGroup.Count(Function(r) r.Field(Of Decimal)("IMPRIC") > 0),
.Special = locGroup.Count(Function(r) r.Field(Of Boolean)("isSpecial") = True),
.Commented = locGroup.Count(Function(r) r.Field(Of String)("vehComments") = "Y"),
.Pictures = locGroup.Count(Function(r) r.Field(Of Int32)("numPics") > 0),
.Age = locGroup.Sum(Function(r) r.Field(Of Int32)("AGE"))
}
我已经尝试在 C# 中复制您的查询,这就是我使用的:
var infoTable=new []{
new { IMLOCN=50,IMPRIC=5.0,isSpecial=false,vehComments="Y",numPics=21,Age=100 },
new { IMLOCN=50,IMPRIC=5.8,isSpecial=true,vehComments="Y",numPics=23,Age=200 },
new { IMLOCN=0,IMPRIC=2.0,isSpecial=false,vehComments="N",numPics=0,Age=5 },
new { IMLOCN=0,IMPRIC=4.0,isSpecial=false,vehComments="N",numPics=0,Age=10 }
};
var summaryInfo = infoTable
.GroupBy(i=>i.IMLOCN)
.Select(locGroup=> new {
Location=locGroup.Max(l=>l.IMLOCN),
Inventory=locGroup.Count(l=>l.IMLOCN>0),
Priced=locGroup.Count(l=>l.IMPRIC>0),
Special=locGroup.Count(l=>l.isSpecial),
Commented=locGroup.Count(l=>l.vehComments=="Y"),
Pictures=locGroup.Count(l=>l.numPics>0),
Age=locGroup.Sum(l=>l.Age)
});
结果如下:
不是 VB.NET 专家(而且我很少使用查询语法),我对这个子句有点困惑:Location = p.Field(Of Byte)("IMLOCN")
。这是一个比较,还是试图设置一个名为 Location 的临时变量?这一行: Location=locGroup.Max(l=>l.IMLOCN)
是直接翻译,但我通常会使用 Location=locGroup.Key
代替,因为它是组密钥。 在我的尝试中,它不喜欢 Inventory=locGroup.Count(l=>l.IMLOCN)
说它不能将 IMLOCN 转换为布尔值,这使我得出结论,您正在隐式地将 IMLOCN 转换为布尔值,并且由于 0是错误的,它不计算它们。
TLDR:.Count(lambda)
采用 returns true/false 的 lamda 表达式来确定是否应计算该记录。它为您隐式地将 IMLOCN 转换为布尔值,并且由于 0 转换为 false,因此它不计算这些记录。本质上,您拥有的代码不是在计算 IMLOCN 的数量,而是在计算转换为布尔值时为真的 IMLOCN 的数量。如果你只想知道组中有多少条记录,那么 .Count()
就是你想要的。
我有一个 LINQ 查询,它适用于除位置为 0 之外的所有内容,我想要计算有多少,Inventory = locGroup.Count
行 returns 0。所有其他计数当位置为 0 时,函数工作正常,而当位置不为 0 时,Inventory = locGroup.Count
工作正常。据我所知,你不能在 VS 中调试 LINQ 语句,所以我不确定为什么或如何这不起作用。
不确定如何在 SO 上显示此表格数据
IMLOCN |英普利克 |很特别 | veh评论 |图片 |年龄
50----------------5------------0----------------Y ------------------21--------100
50----------------5.8------------1----------------Y-- --------------23--------200
0----------------2------------0-------------- -N----------------0--------5
0----------------4------------0------------ -N----------------0--------10
预期输出
50 -- 2 -- 2 -- 1 -- 2 -- 2 -- 300
0 -- 2* -- 2 -- 0 -- 0 -- 0 -- 15 *实际结果是0,但其他#保持不变。
Dim summaryInfo = From p In infoTable
Group p By Location = p.Field(Of Byte)("IMLOCN") Into locGroup = Group
Select New With {
Key locGroup,
.Location = locGroup.Max(Function(r) r.Field(Of Byte)("IMLOCN")),
.Inventory = locGroup.Count(Function(r) r.Field(Of Byte)("IMLOCN")),
.Priced = locGroup.Count(Function(r) r.Field(Of Decimal)("IMPRIC") > 0),
.Special = locGroup.Count(Function(r) r.Field(Of Boolean)("isSpecial") = True),
.Commented = locGroup.Count(Function(r) r.Field(Of String)("vehComments") = "Y"),
.Pictures = locGroup.Count(Function(r) r.Field(Of Int32)("numPics") > 0),
.Age = locGroup.Sum(Function(r) r.Field(Of Int32)("AGE"))
}
我已经尝试在 C# 中复制您的查询,这就是我使用的:
var infoTable=new []{
new { IMLOCN=50,IMPRIC=5.0,isSpecial=false,vehComments="Y",numPics=21,Age=100 },
new { IMLOCN=50,IMPRIC=5.8,isSpecial=true,vehComments="Y",numPics=23,Age=200 },
new { IMLOCN=0,IMPRIC=2.0,isSpecial=false,vehComments="N",numPics=0,Age=5 },
new { IMLOCN=0,IMPRIC=4.0,isSpecial=false,vehComments="N",numPics=0,Age=10 }
};
var summaryInfo = infoTable
.GroupBy(i=>i.IMLOCN)
.Select(locGroup=> new {
Location=locGroup.Max(l=>l.IMLOCN),
Inventory=locGroup.Count(l=>l.IMLOCN>0),
Priced=locGroup.Count(l=>l.IMPRIC>0),
Special=locGroup.Count(l=>l.isSpecial),
Commented=locGroup.Count(l=>l.vehComments=="Y"),
Pictures=locGroup.Count(l=>l.numPics>0),
Age=locGroup.Sum(l=>l.Age)
});
结果如下:
不是 VB.NET 专家(而且我很少使用查询语法),我对这个子句有点困惑:Location = p.Field(Of Byte)("IMLOCN")
。这是一个比较,还是试图设置一个名为 Location 的临时变量?这一行: Location=locGroup.Max(l=>l.IMLOCN)
是直接翻译,但我通常会使用 Location=locGroup.Key
代替,因为它是组密钥。 在我的尝试中,它不喜欢 Inventory=locGroup.Count(l=>l.IMLOCN)
说它不能将 IMLOCN 转换为布尔值,这使我得出结论,您正在隐式地将 IMLOCN 转换为布尔值,并且由于 0是错误的,它不计算它们。
TLDR:.Count(lambda)
采用 returns true/false 的 lamda 表达式来确定是否应计算该记录。它为您隐式地将 IMLOCN 转换为布尔值,并且由于 0 转换为 false,因此它不计算这些记录。本质上,您拥有的代码不是在计算 IMLOCN 的数量,而是在计算转换为布尔值时为真的 IMLOCN 的数量。如果你只想知道组中有多少条记录,那么 .Count()
就是你想要的。