我正在尝试运算符逻辑,但在 Linq 中,当 VB.NET 中的值为 0 或什么都没有时,结果与结果不匹配
Let STATUS = If(BLC < 24 And PRSOBNET Is Nothing, "NEED TO PRODUCE", "")
我的代码有问题吗? 。请指导我。
Dim Cardex =
From card In PurchaseDetails.Union(SalesDetails)
Join mst In MasterItem On card.ITEM Equals mst.ITEM
Group card By card.ITEM, mst.PRODUCTIONNAME, mst.BRAND, mst.PRSOBNET Into Group
Let PIQ = (From x In Group Select x.PIQ).Sum
Let SIQ = (From x In Group Select x.SIQ).Sum
Let BLC = (PIQ) - (SIQ)
Let STATUS = If(BLC < 24 And PRSOBNET Is Nothing, "NEED TO PRODUCE", "")
Order By ITEM
Select New ItemCards2 With {
.ITEM = ITEM,
.PRODUCTIONNAME = PRODUCTIONNAME,
.BRAND = BRAND,
.PRSOBNET = PRSOBNET,
.PIQ = If(PIQ <> 0, PIQ, Nothing),
.SIQ = If(SIQ <> 0, SIQ, Nothing),
.BLC = If(BLC <> 0, BLC, Nothing),
.STATUS = STATUS
bindingSource = New BindingSource With {
.DataSource = New BindingList(Of ItemCards2)(Cardex.ToList())
DataGridView1.DataSource = bindingSource
Public Class ItemCards2
Public Property ITEM As String
Public Property PRODUCTIONNAME As String
Public Property BRAND As String
Public Property PRSOBNET As Integer?
Public Property PIQ As Integer?
Public Property SIQ As Integer?
Public Property BLC As Integer?
Public Property STATUS As String
End Class
想要的结果
项目 | 制作名称 | 品牌 | PRSOBNET | PIQ | SIQ | BLC | 状态 |
---|---|---|---|---|---|---|---|
1000 | A | A1 | 20000 | 20 | 27 | -7 | |
10000 | Z | Z1 | 23 | 23 | 需要生产 | ||
2000 | B | B2 | 0 | 2 | -2 | 需要生产 |
如果您特别希望在值为零时发生某些事情,那么您需要指定这一点。这个:
Let STATUS = If(BLC < 24 And PRSOBNET Is Nothing, "NEED TO PRODUCE", "")
不这样做。您甚至将解决方案放在问题标题中:
该值为 0 或 VB.NET 中什么都没有
您的标题中有“或”,但代码中没有
Or
。你知道逻辑是什么,但你没有用代码实现它。
Let STATUS = If(BLC < 24 AndAlso (Not PRSOBNET.HasValue OrElse PRSOBNET.Value = 0), "NEED TO PRODUCE", "")
请注意,我使用了
AndAlso
和 OrElse
,它们是短路布尔运算符。除非您特别想避免短路,否则总是优先使用它们而不是 And
和 Or
,这种情况应该很少见。在这种特定情况下,使用 And
而不是 AndAlso
不会影响结果,但使用 Or
而不是 OrElse
会在 NullReferenceException
为 PRSOBNET.HasValue
的情况下生成 False
,因为它仍然会尝试获得PRSOBNET.Value
。短路可确保如果第一个操作数为 True
,则不会计算第二个操作数。