Pregunta

Tengo el siguiente código:

public List<anEntity> Get(int page, int pagesize, Func<anEntity, IComparable> orderby)
{            
    using (var ctx = new MyContext())
    {                
        return ctx.anEntity.OrderBy(orderby).Skip(pagesize * page).Take(pagesize).ToList();                    
    }           
}

Cuando reviso mi base de datos de perfil (SqlServer 2012), puedo ver una horrible análisis completo de la tabla sin ningún tipo de "TOP" de la cláusula.

La parte interesante:

Si yo hago algo similar, pero la especificación de un hormigón orderby:

return ctx.anEntity.OrderBy(x => x.aField).Skip(pagesize * page).Take(pagesize).ToList();

El perfil muestra un hermoso "TOP" de la cláusula.

Me gustaría evitar tener un montón de métodos, uno para cada "orderby" posibilidad.Cualquier sugerencia sería muy apreciada.

¿Fue útil?

Solución

Eso es porque su orderby parámetro es una función en lugar de la expresión.No hay manera de traducir una función arbitraria en SQL, por lo que todos sus datos en el lado del cliente antes de que se llama a la función.

Cambiar el tipo de parámetro a Expression<Func<anEntity, T>>, donde T es un nuevo parámetro genérico que usted debe agregar a su Get método, y funcionará como se espera.

Por supuesto, usted no será capaz de utilizar una costumbre IComparable, pero no hay ningún modo de que:código personalizado no puede ser traducido en SQL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top