2011-02-21 13 views
11

Tengo un IQueryable. No he llamado a OrderBy ni he hecho nada con eso.¿Cómo puedo saber si un IQueryable es IQueryableQueryable?

Si hago:

// for some reason, isItOrdered is always true 
var isItOrdered = myQueryable is IOrderedQueryable<T> 

Por qué siempre es esto cierto? (Parece que no debería ser así). Y, lo que es más importante, ¿cómo puedo saber si ya se ha ordenado un IQueryable? (Es decir, es realmente una IOrderedQueryable)

me gustaría ser capaz de hacer algo como:

if (myQueryable is IOrderedQueryable<T>) 
    myQueryable = myQueryable.ThenBy(...); 
else 
    myQueryable = myQueryable.OrderBy(...); 
+1

debería ver esta respuesta http://stackoverflow.com/questions/36923850/how-to-know-if-orderby-was-applied-to-query – yosbel

Respuesta

12

No ha mostrado lo que la creación de su consultable para empezar, pero tal vez es naturalmente ordenada de alguna manera ?

Lo que tienes hace cheque si es realmente un IOrderedQueryable<T> - Sospecho que es sólo que su proveedor de consulta siempre proporciona una consultable ordenada, incluso si la orden no es obvia.

EDIT: Bueno, algo más que usted podría intentar:

if (typeof(IOrderedQueryable<T>).IsAssignableFrom(myQueryable.Expression.Type)) 

... o, en general, imprima myQueryable.Expression.Type y ver lo que parece.

+0

El problema es que recibo una desagradable excepción cuando intento hacerlo con ThenBy. Es algo como esto: Expresión de tipo System.Linq.IQueryable no se puede utilizar para el parámetro de tipo IOrderedQueryable del método IOrderedQueryable ThenBy .... – Pedro

+1

@Pedro: Bien, entonces, tengo otra idea ... editar ahora. –

+0

El problema con Entity Framework es que EF 'DbSet ' hereda de 'DbQuery ' que a su vez implementa 'IOrderedQueryable '! Por lo tanto, su afirmación siempre devuelve 'true' si' myQueryable' es una consulta EF pero no ordenada en absoluto. –

1

Algunas implementaciones IQueryable reutilizan la misma clase para IOrderedQueryable<T>.

no hay mucho de un punto en la comprobación de si realmente está ya ordenó a menos que sepa cómo Es ordenado, de lo contrario podría pedir por la misma propiedad exacta cuando se llama ThenBy().

Además, no se puede llamar Queryable.ThenBy() en myQueryable si se trata de una referencia a IQueryable -tienes para su emisión en primer lugar:

if (myQueryable is IOrderedQueryable<T>) 
    myQueryable = ((IOrderedQueryable<T>) myQueryable).ThenBy(...); 
+0

Es cierto. Pero en mi caso no es un problema si tengo un pedido redundante. Me sale una excepción loca como mencioné en el comentario a Jon Skeet. – Pedro

+0

Actualicé mi respuesta para saber por qué obtienes un error de compilación. –

+0

Sí --- Lo echo primero. Todavía tengo la excepción. – Pedro

3

Esto parece funcionar

if (query.Expression.Type == typeof(IOrderedQueryable<T>)) 
    myQueryable = myQueryable.ThenBy(...); 
else 
    myQueryable = myQueryable.OrderBy(...); 
+0

Bueno, esto es feo, pero funciona. ¡Gracias! – Mormegil

Cuestiones relacionadas