Dave Mackey
Dave Mackey

Reputation: 4432

LINQ to Entities does not recognize the method - simple delete statement

I have a GridView and on a row being deleted I trigger the GridView1_RowDeleting sub, but I receive an error "LINQ to Entities does not recognize the method 'System.Web.UI.WebControls.TableCell get_Item(Int32)' method, and this method cannot be translated into a store expression." Code is:

Private Sub GridView1_RowDeleting(sender As Object, e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting
    ' The deletion of the individual row is automatically handled by the GridView.
    Dim dbDelete As New pbu_housingEntities
    ' Remove individual from the bed.
    Dim remove_bed = From p In dbDelete.Beds _
                     Where p.occupant = GridView1.Rows(e.RowIndex).Cells(3).Text _
                     Where p.room = GridView1.Rows(e.RowIndex).Cells(6).Text _
                     Where p.building = GridView1.Rows(e.RowIndex).Cells(5).Text _
                     Order By p.id Descending _
                     Select p

    remove_bed.First.occupant = ""
    dbDelete.SaveChanges()

    ' Increase number of open spaces in room.
    Dim update_occupancy = From p In dbDelete.Rooms _
                           Where p.room1 = GridView1.Rows(e.RowIndex).Cells(6).Text
                           Where p.building = GridView1.Rows(e.RowIndex).Cells(5).Text _
                           Select p

    update_occupancy.First.current_occupancy = update_occupancy.First.current_occupancy - 1
    dbDelete.SaveChanges()

End Sub

The specific line erroring out is:

remove_bed.First.occupant = ""

Upvotes: 0

Views: 1696

Answers (2)

BrokenGlass
BrokenGlass

Reputation: 160922

You have to put those values in variables before executing the query, otherwise the Entity Provider will try to pull the whole object into the query and access it's properties when it is trying to translate it into a SQL statement - which fails since there is no SQL equivalent.

Upvotes: 1

Thomas Levesque
Thomas Levesque

Reputation: 292465

That's because the Linq query is translated to SQL, and there is no way to translate GridView1.Rows(e.RowIndex).Cells(3).Text to SQL. You need to extract the values from the GridView, then use them in the query

Dim occupant As String = GridView1.Rows(e.RowIndex).Cells(3).Text
Dim room As String = GridView1.Rows(e.RowIndex).Cells(6).Text
Dim building As String = GridView1.Rows(e.RowIndex).Cells(5).Text
Dim remove_bed = From p In dbDelete.Beds _
                 Where p.occupant = occupant _
                 Where p.room = room _
                 Where p.building = building _
                 Order By p.id Descending _
                 Select p

Upvotes: 4

Related Questions