在 VB.NET 中创建对象在不同的​​ SQL 服务器上表现不同

Creating an object in VB.NET behaves differently on different SQL servers

我有以下代码,它们在不同的服务器上表现不同。在下面的方法中,如果我写这行代码:

Dim customerPositionsFromPaid = vwCustomerPositionInPaid.SelectAll().Where(conditions).Select(Function(o) New CustomerPositionFromPaidDto(o.FundingYearId.Value, o.DsoId.Value, o.CustomerId.Value, o.CustomerPosition.Value)).ToList()    

它 return 在一个 sql 实例上产生结果,但不会 return 在另一个 sql 实例上产生结果。

但是,如果我将上面的行替换为以下内容,它会在两个 sql 实例上产生 return 的结果。

Dim customerPositionsFromPaid = vwCustomerPositionInPaid.
        SelectAll().
        Where(conditions).
        Select(Function(o) New CustomerPositionFromPaidDto() With {.FundingYearId = o.FundingYearId.Value, .DsoId = o.DsoId.Value, .CustomerId = o.CustomerId.Value, .CustomerPosition = o.CustomerPosition.Value}).
        ToList()

可能是因为 sql 服务器实例有不同的设置,还是与代码本身有关?

--函数

Private Shared Function GetCustomerPositionsFromPaid(ByVal customerID As Integer, ByVal fundingYearID As Integer) As IEnumerable(Of CustomerPositionFromPaidDto)
    Dim conditions = PredicateBuilder.True(Of vwCustomerPositionInPaid)()
    conditions = conditions.And(Function(o) o.CustomerId.Equals(customerID))
    conditions = conditions.And(Function(o) o.FundingYearId.Equals(fundingYearID))
    conditions = conditions.And(Function(o) o.DsoId.HasValue)

    'Dim customerPositionsFromPaid = vwCustomerPositionInPaid.SelectAll().Where(conditions).Select(Function(o) New CustomerPositionFromPaidDto(o.FundingYearId.Value, o.DsoId.Value, o.CustomerId.Value, o.CustomerPosition.Value)).ToList()
    'Dim customerPositionsFromPaid = vwCustomerPositionInPaid.SelectAll().Where(conditions).Select(Function(o) New With {.FundingYearId = o.FundingYearId.Value, .DsoId = o.DsoId.Value, .CustomerId = o.CustomerId.Value, .CustomerPosition = o.CustomerPosition.Value}).ToList().Select(Function(o) New CustomerPositionFromPaidDto(o.FundingYearId, o.DsoId, o.CustomerId, o.CustomerPosition)).ToList()
    Dim customerPositionsFromPaid = vwCustomerPositionInPaid.
        SelectAll().
        Where(conditions).
        Select(Function(o) New CustomerPositionFromPaidDto() With {.FundingYearId = o.FundingYearId.Value, .DsoId = o.DsoId.Value, .CustomerId = o.CustomerId.Value, .CustomerPosition = o.CustomerPosition.Value}).
        ToList()
    Return customerPositionsFromPaid
End Function

--Select全部

 Public Shared Function [SelectAll](ByVal conditions As Expression(Of Func(Of T, Boolean))) As IEnumerable(Of T)
    Return [SelectAll]().Where(conditions)
End Function

Public Shared Function [SelectAll]() As IQueryable(Of T)
    Return Table
End Function

Private Shared ReadOnly Property Table() As Table(Of T)
    Get
        Return Context.GetTable(Of T)()
    End Get
End Property

我通过编写以下代码设法解决了上述问题。看起来因为 customerid 和 fundingyearid 是可以为 null 的对象,我不得不使用 .Value 属性,但仍然不确定为什么以前的代码可以在一台服务器上运行,而不能在另一台服务器上运行。

Private Shared Function GetCustomerPositionsFromPaid(ByVal customerID As Integer, ByVal fundingYearID As Integer) As IEnumerable(Of CustomerPositionFromPaidDto)
Dim conditions = PredicateBuilder.True(Of vwCustomerPositionInPaid)()
conditions = conditions.And(Function(o) o.CustomerId.Equals(customerID.Value))
conditions = conditions.And(Function(o) o.FundingYearId.Equals(fundingYearID.Value))
conditions = conditions.And(Function(o) o.DsoId.HasValue)


Dim customerPositionsFromPaid = vwCustomerPositionInPaid.
    SelectAll().
    Where(conditions).
    Select(Function(o) New CustomerPositionFromPaidDto() With {.FundingYearId = o.FundingYearId.Value, .DsoId = o.DsoId.Value, .CustomerId = o.CustomerId.Value, .CustomerPosition = o.CustomerPosition.Value}).
    ToList()
Return customerPositionsFromPaid

结束函数