2009-08-12 6 views
7

Linq to SQL utiliza ROW_NUMBER() para buscar páginas, es decir, cuando usa Skip() y Take().Cómo buscar el ROW_NUMBER() de una fila con Linq a SQL

Sin embargo, parece que no puedo encontrar una forma de acceder realmente a los valores ROW_NUMBER() en la consulta. Necesito encontrar el ROW_NUMBER() de un registro dentro de una consulta (sin recuperar todos los registros).

He hecho esto con éxito en T-SQL y Linq to Objects, pero una solución Linq to SQL está resultando difícil de alcanzar.

en LINQ a objetos que puedo conseguir el número de fila de esta manera:

Pero LINQ a SQL no es compatible con las sustituciones de Select() que utilizan un parámetro de índice (y que tiene sentido, en realidad - ROW_NUMBER() gustaría solo se usará si se usa Skip() y Take()).

Parece que no puedo encontrar una solución que no dé como resultado que se devuelvan todos los registros de la base de datos.

¿Esto es posible?

+0

http://stackoverflow.com/questions/1165028/how-do-i-add-rownumber-to-a-linq-query-or-entity duplicado? –

+1

@bassfriend - EF y LINQ-to-SQL tienen soporte completamente diferente para tales operaciones ... –

+0

Esperaba ver una respuesta aquí. Me estoy encontrando con el mismo problema: la sobrecarga indexada no funciona con L2S. Estaría contento con cualquier ID incremental; Supongo que tendré que hacerlo en varios pasos. –

Respuesta

2

(edit: lo intentó; sigue dando "Unsupported overload used for query operator 'Select'") ...

¿Por qué utiliza SelectMany aquí? ¿Lo has probado con la versión de Select que incluye el índice?

.Select((obj, index) => new { obj.ID, Index = index }) 
    .SingleOrDefault(x => x.ID == targetID); 

También debe probablemente incluirá una explícita OrderBy - LINQ a SQL le permite alejarse sin que la mayor parte del tiempo, pero EF no lo hace.

+0

Gracias, he reparado la consulta. Pero sí, como dices, aún no es compatible. :( – stucampbell

+0

no hay solución para esto todavía? (* Además de una función de SQL? *) –

-1

Usted debe incluir AsEnumerable()

i.e.

var rowTarget = 
    mainQuery.AsEnumerable() 
     .Select((obj, index) => new { obj.ID, Index = index }) 
     .SingleOrDefault(x => x.ID == targetID); 
+0

'AsEnumerable' desplegará todos los registros de la base de datos, por lo que se anula el propósito. – jordanbtucker

+0

Esto no es realmente una solución, alguien por favor vote abajo – Adaptabi

+0

Downvoting esto, ya que actualmente aparece en la parte superior, pero, como dice DotNetWise, no es una solución. – stucampbell