为什么在 VB.NET 中当值为 0 或无值时,Linq 中的运算符逻辑与结果不匹配

问题描述 投票:0回答:1

我正在尝试运算符逻辑,但在 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 需要生产
.net vb.net linq logical-operators
1个回答
0
投票

如果您特别希望在值为零时发生某些事情,那么您需要指定这一点。这个:

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
,则不会计算第二个操作数。

© www.soinside.com 2019 - 2024. All rights reserved.