Исключения LINQ to Entities (ElementAtOrDefault и CompareObjectEqual) - PullRequest
2 голосов
/ 05 апреля 2010

Я работаю над платформой доставки, которая в конечном итоге автоматизирует доставку через несколько крупных перевозчиков. У меня есть Usercontrol ShipmentsView, который отображает список отправлений (возвращаемых EntityFramework), и когда пользователь нажимает на элемент отгрузки, он порождает ShipmentEditView и передает ShipmentID (RecordKey) в это представление.

Сначала я пытался получить контекст от родителя (ShipmentsView) и, наконец, отказался от решения вернуться к нему позже. Я хотел сделать это, чтобы сохранить один экземпляр контекста. во всяком случае, теперь я создаю новый экземпляр контекста в моем ShipmentEditViewModel и запрашиваю его для записи отгрузки. Я знаю, что могу просто пропустить запись, но я хотел использовать Ocean Framework, которую написал Карл Шиффлетт, и не хочу прикидываться написанием новых методов перехода.

Так или иначе, я запрашиваю, и при переходе через него я вижу, что он возвращает запись, как только выполнение достигает точки, где он назначил результат запроса свойству 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) », и этот метод нельзя преобразовать в выражение хранилища.

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)', и этот метод нельзя преобразовать в выражение хранилища.

Я пытался заставить эту вещь отображать запись в течение трех дней. я серьезно думаю о возвращении и реинжиниринге его без паттерна MVVM (который, как я понимаю, я только начинаю изучать и понимать), только для того, чтобы заставить & $ ^% ed работать. Любая помощь будет принята с благодарностью.

Cory

Ответы [ 2 ]

3 голосов
/ 06 апреля 2010

Это:

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

Поскольку вы хотите сравнить идентификатор с идентификатором, а не с объектом.

Это:

    Case 1
        e.Result = myResult(0)

Должно быть:

    Case 1
        e.Result = myResult.First()
1 голос
/ 06 апреля 2010

Я не знаком с 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

Надеюсь, что это, по крайней мере, может дать вам искру творчества или направления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...