15 votes

Comment savoir si un IQueryable est un IOrderedQueryable ?

J'ai un IQueryable. Je n'ai pas appelé OrderBy ou fait quoi que ce soit avec.

Si c'est le cas :

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

Pourquoi est-ce toujours le cas ? (Et, plus important encore, comment puis-je savoir si un IQueryable a déjà été ordonné ? (c'est-à-dire qu'il s'agit vraiment d'un IOrderedQueryable)

J'aimerais pouvoir faire quelque chose comme.. :

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

14voto

Jon Skeet Points 692016

Vous n'avez pas indiqué ce qui crée votre requête au départ, mais peut-être est-elle naturellement ordonnée d'une manière ou d'une autre ?

Ce que vous avez fait vérifier s'il s'agit bien d'un IOrderedQueryable<T> - Je pense que c'est simplement parce que votre fournisseur de services d'interrogation toujours fournit une requête ordonnée, même si l'ordre n'est pas évident.

EDIT : Ok, quelque chose d'autre que vous pourriez essayer :

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

... ou en général, imprimer myQueryable.Expression.Type et voir à quoi cela ressemble.

7voto

John Points 160

Cela semble fonctionner

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

1voto

Mark Cidade Points 53945

Certains IQueryable réutilisent la même classe pour les IOrderedQueryable<T> .

Il n'est pas vraiment utile de vérifier si le produit est vraiment déjà commandé, sauf si vous le savez. comment il est ordonné, sinon vous risquez d'ordonner par la même propriété lorsque vous appelez ThenBy() .

Vous ne pouvez pas non plus appeler Queryable.ThenBy() sur myQueryable s'il s'agit d'une référence à IQueryable -Il faut d'abord le lancer :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X