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() 就是你想要的。