我有一个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"))
}
答案 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)
});
有了这个结果:
不是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()
就是您想要的。