2013-07-17 17 views
7

C'è un modo per scoprire se un oggetto IQueryable ha un ordine applicato all'interno del suo albero delle espressioni?Verifica se un Linq IQueryable ha un ordine applicato

Lo scenario che ho è che un controllo di griglia ha abilitato il paging e l'ordinamento per colonna. Tuttavia non esiste un ordinamento applicato per impostazione predefinita, quindi in questo caso da Linq a SQL viene eseguita una selezione orribile per il conteggio delle righe, quindi in tutti gli scenari è necessario fornire un ordine, tuttavia dovrei applicare un ordine predefinito per chiave primaria se non è stato specificato nessun altro ordine.

Quindi è possibile?

+1

L'unico modo che posso pensare è di fare un orderby e vedere se l'ordine è lo stesso, o impostare un booleano al momento dell'ordine, modificare un modo più breve può essere quello di confrontare gli elementi per vedere se sono ordinati – Sayse

+0

In che modo il orderby (id) aiuta l'enorme scelta? – usr

+0

@usr Linq2Sql utilizzerà ALL COLUMNS nel suo 'SELECT ROW_NUMBER() OVER (ORDER BY Grofit

risposta

6

È possibile scoprire controllando l'albero delle espressioni della query utilizzando un custom ExpressionVisitor o qualsiasi meccanismo di attraversamento ricorsivo di propria scelta.

Sento che il codice non è ben progettato. Probabilmente dovresti semplicemente ricordare che l'ordine è stato applicato da qualche parte come bool. Forse il flusso di informazioni della tua app deve essere rearchitected.

Con questo approccio di ispezione si stanno recuperando queste informazioni in modo hacker.

+0

Oh sì non c'è dubbio nella mia mente questo è male codice progettato, sfortunatamente come sono vincolato dalle scelte tecnologiche dei miei clienti dai tempi preistorici sono limitato nelle mie scelte per risolvere il problema sottostante, e il controllo griglia * può * avere un ordinamento predefinito applicato, ma qualcuno può comunque disattivare l'ordinamento che potrebbe causare problemi, quindi lavorare sulla query sottostante (poiché passa attraverso un'interfaccia comune per l'elaborazione prima di essere utilizzata dalla griglia). – Grofit

Problemi correlati