Search code examples
entity-framework-ctp5

EF4 throws NotSupported exception when it (imho) shouldn't


OK, this thing just puzzles me. I have a table, say Users, with columns UserID, Name, etc. Have an object mapped to it using CTP5. So now I want to test it, and do the following:

List<User> users = new List();
// Some init code here, making say 3 users.
using (UsersDbContext)
{
  // insert users
}

So far so good, works fine. Now I want to see if the records match, so I select the users back using the following code.

using (UsersDbContext dbc = UsersDbContext.GetDbContext())
{
List<Users> usersRead = dbc.Users.Where(x => x.ID >= users[0].ID && x.ID <= users[users.Count - 1].ID).ToList();
}

This throws and exception:

System.NotSupportedException: LINQ to Entities does not recognize the method 'User get_Item(Int32)' method, and this method cannot be translated into a store expression.

EF has difficulties seeing that I'm just asking to return an int in Users[0].ID ?
If I replace a call to users[0].ID with a straight int - works fine.

I get what it's trying to do, but I thought it should be pretty easy to check if the method belongs to .NET or Sql Server ?


Solution

  • You are trying to access an indexer in an EF expression, which doesn't translate to an SQL query. You'll have to move the parameters outside the query like this:

    int first = users[0].ID;
    int last = users[users.Count - 1].ID;
    List<Users> usersRead = dbc.Users.Where(x => x.ID >= first && x.ID <= last).ToList();