LINQ to Entities异常(ElementAtOrDefault和CompareObjectEqual)

时间:2010-04-05 19:27:03

标签: wpf entity-framework mvvm

我正在开发一个运输平台,最终将通过几家主要运营商实现自动化运输。我有一个ShipmentsView Usercontrol,它显示一个Shipments列表(由EntityFramework返回),当用户点击一个货件项时,它会生成ShipmentEditView并将ShipmentID(RecordKey)传递给该视图。

我最初尝试从父级(ShipmentsView)获取上下文并最终放弃解决以便稍后进行操作。我想这样做以保持上下文的单个实例。无论如何,我现在在ShipmentEditViewModel中创建一个新的上下文实例,并针对Shipment记录查询它。我知道我可以通过记录,但是我想使用Karl Shifflett编写的海洋框架,并且不想编写新的过渡方法。

所以无论如何,我查询并在单步执行时,我可以看到它返回一条记录,一旦执行到达将查询结果分配给e.Result属性的点,它就会抛出以下异常,具体取决于我用的查询。

LINQToEntities

Dim RecordID As Decimal = CDec(e.Argument)
    Dim myResult = From ship In _Context.Shipment _
                   Where ship.ShipID = e.Argument _
                   Select ship
    Select Case myResult.Count
        Case 0
            e.Result = New Shipment
        Case 1
            e.Result = myResult(0)
        Case Else
            e.Result = Nothing
    End Select

“LINQ to Entities无法识别方法'System.Object.CompareObjectEqual(System.Object,System.Object,Boolean)'方法,并且此方法无法转换为商店表达式。

通过Method调用LINQToEntities

       Dim RecordID As Decimal = CDec(e.Argument)
    Dim myResult = _Context.Shipment.Where(Function(s) s.ShipID = RecordID)

    Select Case myResult.Count
        Case 0
            e.Result = New Shipment
        Case 1
            e.Result = myResult(0)
        Case Else
            e.Result = Nothing
    End Select

LINQ to Entities无法识别方法'SnazzyShippingDAL.Shipment ElementAtOrDefault [Shipment](System.Linq.IQueryable`1 [SnazzyShippingDAL.Shipment],Int32)'方法,并且此方法无法转换为商店表达式。< / p>

我一直试图让这件事显示三天的记录。我正在认真考虑回归并重新设计它而没有MVVM模式(我意识到我只是开始学习和理解),只是为了让&amp; $ ^%ed的东西起作用。任何帮助将非常感激。

科里

2 个答案:

答案 0 :(得分:3)

这:

Dim RecordID As Decimal = CDec(e.Argument)
Dim myResult = From ship In _Context.Shipment _
               Where ship.ShipID = e.Argument _
               Select ship

......应该是:

Dim RecordID As Decimal = CDec(e.Argument)
Dim myResult = From ship In _Context.Shipment _
               Where ship.ShipID = RecordID _
               Select ship

因为您想要将ID与ID进行比较,而不是与对象进行比较。

此:

    Case 1
        e.Result = myResult(0)

应该是:

    Case 1
        e.Result = myResult.First()

答案 1 :(得分:1)

我不熟悉vb,但我对linq有点熟悉。我想知道你是否可以执行.FirstOrDefault()函数。它就像执行一个标量存储过程我不确定转换为vb但是我知道c#所以我不知道这是否有帮助,因为看起来你可能遇到了试图将信息传递给e.result的问题但在这里它

    Dim myResult = (From ship In _Context.Shipment _
                   Where ship.ShipID = e.Argument _
                   Select ship.ShipID).FirstOrDefault()
    If myResult <> null
     Then e.Result = myResult
     Else e.Result = (function that creates a new shipment and returns the object back).ShipID

希望这至少可以给你一个创造力或方向的火花