tengo un método en mi clase parcial generada de esta manera:Saltee() Tomar() en las propiedades de navegación Entity Framework está ejecutando SELECT * en mi SQL Server
var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();
Cuando miro mi SQL Server , Puedo ver que el código generado está haciendo un SELECT *.* FROM Children
Este código es tomado directamente de mi clase, he verificado que el orden de mi Omitir/Tomar es ANTES de mi .ToList.
Si quito el .ToList, esa línea es rápido (y sin SQL se envía a mi DB), pero en el momento que intento foreach
sobre los resultados, me sale el mismo SQL enviada a mi DB: SELECT *.* FROM Children
.
¿Hay algo especial que deba hacer al usar .Skip y .Take en las propiedades de navegación de mis entidades?
actualización
Voy a tratar de obtener el SQL real generada, no estoy actualmente configurado para ello. Encontré el primero porque aparece en la lista de "consultas recientemente caras" de SSMS.
La ejecución de este:
var pChildren = this.Children
//.Skip(skipRelated)
//.Take(takeRelated)
.ToList();
vuelve ~ 4.000.000 filas y tarda unos 25 segundos.
La ejecución de este:
var pChildren = this.Children
//.Skip(skipRelated)
.Take(takeRelated)
.ToList();
vuelve ~ 4.000.000 filas y tarda unos 25 segundos.
Como dije, tomaré el SQL generado para estos y los presentaré también.
Lo SQL esperabas este código para generar? – cdhowie
Esperaba algo así como 'SELECCIONAR TOP 10 FROM Children DONDE ParentID = @ idOfParentEntity' (Olvidé cómo EF maneja .Skip, pero he leído que se supone que lo haga. Si ejecuté esta consulta directamente contra mi contexto, parece que limite los datos devueltos a una "página" específica) – Nate
La presencia de '.Skip()' impide el uso de 'TOP'. A menos que esperara que sumara 'skipRelated' y' takeRelated' y lo utilizara como parámetro para 'TOP' ... lo cual podría ser una optimización, pero también podría no tener impacto en el rendimiento. – cdhowie