LINQ to Entities não reconhece o método ‘System.Linq.IQueryable’

Eu quero executar este código simples LINQ para ter número de registro no LINQ, mas o resultado está abaixo do erro

var model = _db2.Persons.Select( (x, index) => new { rn = index + 1, col1 = x.Id }).ToList(); 

Erro:

LINQ to Entities não reconhece o método ‘System.Linq.IQueryable 1[f__AnonymousType2 2 [System.Int32, System.Int32]] Selecione [Person, f__AnonymousType2 2](System.Linq.IQueryable 1 [MvcApplication27.Models .Person], System.Linq.Expressions.Expression 1[System.Func 3 [MvcApplication27.Models.Person, System.Int32, f__AnonymousType2`2 [System.Int32, System.Int32]]]) ‘método, e este método não pode ser traduzido em uma expressão de armazenamento.

O problema é que o LINQ to Entities não entende como converter essa sobrecarga Select (aquela que fornece o índice) em uma consulta SQL. Você pode corrigir isso selecionando primeiro a parte do database de que precisa (para evitar a seleção desnecessária de todas as colunas) e, em seguida, fazendo AsEnumerable() para AsEnumerable() -lo como IEnumerable vez de IQueryable e, em seguida, Select puramente em C # (em suma, IQueryable s são convertidos em SQL, enquanto IEnumerable s são executados em código).

 var model = _db2.Persons.Select(x => x.Id).AsEnumerable().Select( (id, index) => new { rn = index + 1, col1 = id }).ToList(); 

Observe que a consulta que você tem parece estar desordenada, portanto, os pares de ID / índice podem mudar cada vez que você chama isso. Se você espera consistência, você deve pedir por algo (por exemplo, _db2.Persons.OrderBy(...) ).

Editar

Adicionando comentário de Scott :

Como uma boa referência aqui está a lista de todas as instruções Linq embutidas no framework e uma listview se é compatível ou não .

Você poderia apenas selecionar o Id e depois criar seu próprio object anônimo usando linq para objects, por exemplo:

 var model = _db2.Persons.Select(x => x.Id) .ToList() // return int[] .Select((id, index) => new { rn = index + 1, col1 = id }) // return anonymous[] (with rn and col1) .AsEnumerable(); // get an IEnumerable (readonly collection) 

Provavelmente isso acontece porque o Entity Framework não suporta esse tipo de consulta usando o linq como o linq poderia fazer na memory, portanto, nesse caso, você pode selecionar apenas o que precisa ( id no seu caso) e executá-lo, usando o método ToList() para concretizar sua consulta e depois disso você terá uma lista na memory, então, você pode usar o linq para objects e usar o método suportado que você quiser.