62 messaggi dal 22 ottobre 2012
Utilizzo :

Me.lvw1.Sort(e.sortExpression, e.sortDirection)

per eseguire l'ordinato della listview.
Se e.sortExpression contienet un solo campo tipo "codcf" funziona senza problemi, se l'espreissione contiente esempio "codcf,dtavar" non esegue nessun ordinamento.

La listview utilizza EF.

Qualche idea ?

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

rubinim ha scritto:

se l'espreissione contiente esempio "codcf,dtavar" non esegue nessun ordinamento.

Sembra corretto, la sortexpression ammette più di un campo, infatti nella documentazione si legge:

To sort multiple columns, create a sort expression that contains a comma-separated list of field names

Tuttavia a te non sta funzionando, e per capire perché dovresti postare un po' di codice.

Comunque, specie se usi la paginazione, fai attenzione che l'ordinamento non si verifichi lato client altrimenti solo la pagina corrente verrà ordinata.

Puoi prendere il controllo dell'ordinamento se aggiungi la sortexpression come parametro al tuo SelectMethod (ammesso che tu stia usando dei metodi come nell'altro thread e non un EntityDataSource, per esempio).

Public Function ElencaT1(sortByExpression As String) As IEnumerable(Of Engine.T1)


In questo modo la sortExpression verrebbe passata al SelecMethod e tu avresti l'opportunità di parsarla e chiamare una o più volte l'OrderBy sull'IQueryable che ti arriva dal BLL. Puoi aiutarti con questo extension method per "tradurre" l'espressione stringa in chiamate a OrderBy.
http://blog.cincura.net/229310-sorting-in-iqueryable-using-string-as-column-name/

ciao,
Moreno
Modificato da BrightSoul il 03 agosto 2014 12.57 -

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Ho implementato extension :

query = query.OrderBy("codcf").ThenBy("dtavar")

funziona corretamente, ma devo da codice costruire l'istruzione ...
... order.then.then ... in funzione di quante colonne ho nell'espressione se non ho capito male.

Secondo te per fare qualcosa di dinamico, come posso fare ?
Per le istruzioni di selezioni utilizzo LINQKit PredicateBuilder

Ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

rubinim ha scritto:

... order.then.then ... in funzione di quante colonne ho nell'espressione se non ho capito male.

Esatto.

rubinim ha scritto:

Secondo te per fare qualcosa di dinamico, come posso fare ?

Alla pagina che ti avevo linkato trovi appunto un extension method per fare l'ordinamento in maniera dinamica. L'hai provato?
http://blog.cincura.net/229310-sorting-in-iqueryable-using-string-as-column-name/

ciao,
Moreno.

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Si ho creato l'extension, ma se io passo come paramentro alla funzione l'ordinamento esempio "field1,field2,field2 ... fieldn" come faccio per costruire dinamicamente l'istruzione:

query = query.OrderBy("field1").ThenBy("field2") .......

Ciao e Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
ci pensa lui, vedi che contiene appunto il codice per decidere quando invocare OrderBy e quando ThenBy? Questo extension method manipola l'expression tree per aggiungere dinamicamente OrderBy e poi ThenBy.

MethodCallExpression call = Expression.Call(
typeof(Queryable),
(!anotherLevel ? "OrderBy" : "ThenBy") + (descending ? "Descending" : string.Empty),
...

Tu devi semplicemente invocarlo così:
//query è il tuo oggetto IQueryable
query = query.OrderingHelper("field1,field2,field3");

Il risultato di OrderingHelper (che io qui riassegno alla stessa variabile query) sarà un IQueryable il cui expression tree è già stato integrato con le varie chiamate a OrderBy e ThenBy. Quando la ListView estrarrà i risultati, ne usciranno fuori ordinati secondo i tuoi criteri.

ciao,
Moreno
Modificato da BrightSoul il 19 agosto 2014 08.38 -

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Ciao, io ho convertito l'estensione in vb.

Imports System.Linq.Expressions
Module ModuleBLL
<System.Runtime.CompilerServices.Extension> _
Public Function OrderingHelper(Of T)(source As IQueryable(Of T), propertyName As String, descending As Boolean, anotherLevel As Boolean) As IOrderedQueryable(Of T)

Dim param As ParameterExpression = Expression.Parameter(GetType(T), String.Empty)
Dim prop As MemberExpression = Expression.PropertyOrField(param, propertyName)
Dim sort As LambdaExpression = Expression.Lambda(prop, param)

Dim c As MethodCallExpression = Expression.Call(GetType(Queryable),
(If(Not anotherLevel, "OrderBy", "ThenBy")) + (If(descending, "Descending", String.Empty)),
New System.Type() {GetType(T), prop.Type},
source.Expression,
Expression.Quote(sort))

Return DirectCast(source.Provider.CreateQuery(Of T)(c), IOrderedQueryable(Of T))
End Function

<System.Runtime.CompilerServices.Extension> _
Public Function OrderBy(Of T)(source As IQueryable(Of T), propertyName As String) As IOrderedQueryable(Of T)
Return OrderingHelper(source, propertyName, False, False)
End Function

<System.Runtime.CompilerServices.Extension> _
Public Function ThenBy(Of T)(source As IOrderedQueryable(Of T), propertyName As String) As IOrderedQueryable(Of T)
Return OrderingHelper(source, propertyName, False, True)
End Function

<System.Runtime.CompilerServices.Extension> _
Public Function OrderByDescending(Of T)(source As IQueryable(Of T), propertyName As String) As IOrderedQueryable(Of T)
Return OrderingHelper(source, propertyName, True, False)
End Function

<System.Runtime.CompilerServices.Extension> _
Public Function ThenByDescending(Of T)(source As IOrderedQueryable(Of T), propertyName As String) As IOrderedQueryable(Of T)
Return OrderingHelper(source, propertyName, True, True)
End Function

End Module

poi eseguo il metodo:

//query è il tuo oggetto IQueryable
query = query.OrderingHelper("codcf,dtavar", False, False);

ho un'eccezione in Dim prop As MemberExpression = Expression.PropertyOrField(param, propertyName) in quanto non riconosce la proprietà

Eccezione di tipo 'System.ArgumentException' in System.Core.dll non gestita nel codice utente

Ulteriori informazioni: 'codcf,dtavar' non è un membro del tipo ....
11.886 messaggi dal 09 febbraio 2002
Contributi
Scusa, hai ragione tu. Avevo interpretato male l'uso di quel metodo.

Ripartiamo da qui:

come faccio per costruire dinamicamente l'istruzione:
query = query.OrderBy("field1").ThenBy("field2") .......


Devi fare uno split sulla stringa iniziale che contiene i nomi di tutti i campi. Fai un ciclo, ed invochi l'OrderBy su ciascun campo. Ecco un esempio (da testare):
'Faccio lo split sulla stringa per ottenere un array
Dim campi = "campo1,campo2 DESC,campo3".Split(",")
    
'Ora ciclo l'array
Dim i As Integer
For i = 0 To campi.Length-1

Dim campo = campi(i).Trim()
'Determino la direzione di ordinamento
Dim desc = campo.EndsWith(" DESC")
'Se ci fossero spazi, prendo solo la prima parte
campo = campo.Split(" ")(0)

'query è il tuo oggetto IQueryable
query = query.OrderBy(campo, desc, i > 0)
Next


ciao,
Moreno
Modificato da BrightSoul il 20 agosto 2014 09.42 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.