如果按列分组为0

时间:2016-01-13 19:23:05

标签: vb.net linq byte

我有一个LINQ查询,除了当位置为0并且我想要计数多少时,Inventory = locGroup.Count 行返回0时,所有其他Count函数在位置时工作正常当位置不是0时,Inventory = locGroup.Count工作正常。据我所知,你不能在VS中调试LINQ语句,所以我不确定为什么或如何这不起作用。

不确定如何在SO

上显示此表格数据

IMLOCN | IMPRIC |是特殊的| vehComments | numPics |年龄

50 -------------- 5 ------------ --------------- 0 Y-- --------------- ------- 21 100

50 -------------- 5.8 ---------- 1 ---------------ÿ---- ------------- 23 ------- 200

0 --------------- 2 ------------- 0 ---------------Ñ ----------------- --------- 0 5

0 --------------- 4 ------------- 0 ---------------Ñ ----------------- --------- 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"))
         }

1 个答案:

答案 0 :(得分:1)

我试图用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)
});

有了这个结果:

enter image description here

不是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)获取一个返回true / false的lamda表达式,以确定是否应该计算该记录。它隐式地将IMLOCN转换为布尔值,并且由于0转换为false,因此不计算这些记录。实质上,你拥有的代码不计算IMLOCN的数量,它计算的是当转换为布尔值时IMLOCN的数量是真的。如果您只想知道组中有多少条记录,那么.Count()就是您想要的。