2011-12-13 3 views
5

Ho faticato per farlo funzionare. Vorrei avere una dichiarazione EF prendere in una colonna per ordinare. La mia dichiarazione originale era questa:Entity Framework e ordine dinamico per dichiarazioni

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby P.LastName 
        select P; 

E ho cambiato questo al seguente:

var Query = from P in DbContext.People 
        where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
        orderby sortField 
        select P; 

Dove sortField è la colonna che vogliamo ordinamento, ed è una stringa cioè LastName. Tuttavia, non sembra funzionare, non ha sorting e la stringa SQL emessa è completamente sbagliata. Qualcuno ha funzionato prima?

risposta

11

Si potrebbe provare a passare in un'espressione per il metodo con il seguente tipo:

Expression<Func<Person, object>> expr = p => p.LastName; 

e quindi utilizzando le estensioni LINQ invece di espressioni LINQ ...

var Query = 
DbContext.People 
.Where(P => P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId)) 
.OrderBy(expr) 
.ToList(); 
+0

eccellente risposta, in questo caso particolare, questo sembra una soluzione migliore in modo da userò questo, grazie. – eyeballpaul

+0

C'è un modo per aggiungere una clausola "asc" e "desc" qui? – eyeballpaul

+0

Inoltre, perché dovrebbe funzionare con proprietà stringa e non interi? Una delle proprietà è un Int32 e quando provo a ordinare in quell'ordine viene visualizzato l'errore: "{" Impossibile eseguire il cast del tipo "System.Int32" per digitare "System.Object". LINQ to Entities supporta solo il cast di tipi primitivi di Entity Data Model. "}" – eyeballpaul

3

l'ordinamento non funziona perché stai ordinando su una stringa letterale. Non è illegale, ma non è particolarmente utile neanche. È necessario fornire un campo di smistamento attraverso l'API di IQueryable<T>, per esempio, in questo modo:

var q = from P in DbContext.People 
    where P.BusinessUnits.Any(BU =>BU.BusinessUnitID == businessUnitId) 
    orderby P.LastName 
    select P; 
if ("sortField".Equals("FirstName")) 
    q = q.OrderBy(p => p.FirstName); 
else if ("sortField".Equals("LastName")) 
    q = q.OrderBy(p => p.LastName); 
else if ("sortField".Equals("Dob")) 
    q = q.OrderBy(p => p.Dob); 
+0

Buona risposta. In questo caso specifico sto usando la risposta di BobTodd, tuttavia terrò questo a mente per alcune delle query dinamiche che costruirò presto. – eyeballpaul