2

当我在文本框中输入的车牌号没有对应的汽车 ID 时,我试图在我的 BLL 中引发异常。

我的 DAL 看起来像这样:

Public Class DALCar
    Private dc As New cars_modelDataContext

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim result = (From car In dc.Cars
                    Where car.License_Plate = licensePlate_input
                    Select car.License_Plate).Single
        Return result
    End Function

End Class

这是我的 BLL:

Public Class BLLCar
    Private DALcar As New DALCar

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim carID As String = DALcar.getCarIdByLicensePlate(chassisNo_input)
    End Function

End Class

因此,当没有带有此特定车牌的 carID 时,会在我的 DAL 中引发异常,但是如何在我的 BLL 中而不是在我的 DAL 中引发此异常?

4

2 回答 2

0

因为您Enumerable.Single在 LINQ 表达式中使用。如果序列中有多个元素或序列为空,则会引发异常。

如果您可以假设该序列将始终包含 0 或 1 个元素,那么您可以替换SingleFirstOrDefault(有关此内容的更多信息,请参见下文)。它将返回序列中的第一个元素,或者Nothing如果序列为空。

在这种情况下,您可以在 BLL 中检查并Nothing在那里抛出适当的异常。

在你的 DAL 中像这样:

Public Class DALCar
    Private dc As New cars_modelDataContext

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim result = (From car In dc.Cars
                    Where car.License_Plate = licensePlate_input
                    Select car.License_Plate).FirstOrDefault
        Return result
    End Function
End Class

这在你的 BLL 中:

Public Class BLLCar
    Private DALcar As New DALCar

    Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
        Dim carID As String = DALcar.getCarIdByLicensePlate(chassisNo_input)
        If carId = Nothing Then
            Throw New ArgumentException("There is no match.")
        End If
    End Function
End Class

如果您的查询可能返回多个元素,则您必须考虑这是否是错误。如果允许并且您想处理(返回)第一个,那么继续FirstOrDefault. 如果这是一个错误,那么你应该从你的 DAL 返回一个枚举并检查你的 BLL 中的项目数(否则,使用Single,你仍然会在 DAL 中抛出)。

于 2012-11-24T11:49:56.807 回答
0

使用FirstOrDefault 而不是 Single

Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
    Dim result = (From car In dc.Cars
                Where car.License_Plate = licensePlate_input
                Select car.License_Plate).FirstOrDefault 
    Return result


 Public Function getCarIdByLicenePlate(ByVal licensePlate_input As String) As String
    Dim carID As String = DALcar.getCarIdByLicensePlate(chassisNo_input)
    If carID = Nothing Then
       Throw New Exception(String.Format("Can't find car id for chassisNo : {0}", chassisNo_input))
    End If
End Function
于 2012-11-24T11:51:53.920 回答