Attualmente sto sviluppando una API con asp.core. Per l'accesso ai dati, utilizzo il framework delle entità con il caricamento lazy.
Esempio:
+-------------------+
| Car |
+-------------------+
| Id | int |
+----------+--------+
| Name | string |
+----------+--------+
| DriverId | int |
+----------+--------+
+----------------------+
| Driver |
+----------------------+
| Id | int |
+-------------+--------+
| PhoneNumber | string |
+-------------+--------+
Il DriverId
nella tabella Car
è una chiave esterna.
Ora voglio avere una lista di macchine dalla mia api. Quindi voglio l'impaginazione, la ricerca e l'ordinamento. L'unico problema per me è l'ordinamento.
Di default dovrebbero essere ordinati in questo modo:
Ma non è questo il problema. Posso farlo con data.OrderBy(x => x.Name).ThenBy(x => x.Driver.PhoneNumber...
Ma ora voglio che il cliente possa darmi il nome della proprietà in base al quale le auto dovrebbero essere ordinate (oltre la stringa della query).
Per la proprietà Car.Name
questo non è un problema perché dopo aver ordinato le auto con il codice predefinito. Posso ottenere la proprietà in questo modo: var sortingProp = typeof(Car).GetProperty(sortingPropName);
. E poi posso ordinare da quella proprietà in questo modo: data.OrderBy(x => sortingProp)
.
Ora la mia domanda: come posso lasciare che il client mi dia sth in questo modo: sorting property name = 'Driver.PhoneNumber'
e quindi l'api dovrebbe ordinare per quella proprietà delle auto? È possibile farlo senza digitare fortemente una nuova query per ogni proprietà dell'oggetto Car
?
Grazie
Se il tuo scenario è più semplice e non hai affatto bisogno di dinamica, puoi semplicemente fare così:
query = query.OrderBy(i => i.item.item_id);
// OR
query = query.OrderByDescending(i => i.item.item_id);
..che userebbe la proprietà stessa.
Se hai davvero bisogno di dinamica (il che significa che dovresti ordinare in base a qualsiasi campo e non vuoi inserire molti if
nel tuo codice), allora dovrai installare questo pacchetto System.Linq.Dynamic eseguendo questo in la console di gestione pacchetti :
Install-Package System.Linq.Dynamic
Quindi aggiungi questo using
clausola:
using System.Linq.Dynamic;
Quindi è possibile ottenere un ordine dinamico con quanto segue:
query = query.OrderBy("item.item_id DESC"); // keep the IQueryable
// OR
var items = query.OrderBy("item.item_id DESC").ToList(); // order in database...
Quando si utilizza questa libreria dinamica, non esiste OrderByDescending
, poiché è possibile passare ASC o DESC con la stringa passata al metodo OrderBy()
(come nel mio esempio).
Prendi nota che l' item
è lo stesso nome della proprietà all'interno di ItemInfo
. Inoltre, ToList()
è solo un esempio, in realtà non ti serve affatto, a seconda del tuo scenario.
Anche se ti suggerirei di modificare ItemInfo
in modo che sia così:
public class ItemInfo {
public int item_id { get; set; }
public int category_id { get; set; }
}
... quindi correggi la tua query per popolare di conseguenza:
IQueryable<ItemInfo> query = (from i in Item
join c in ItemCategory on i.category_id equals c.category_id
select new ItemInfo() {
item_id = i.item_id,
category_id = c.category_id
};
query.OrderBy("item_id DESC");
Questo sembra più semplice e più pulito dal mio punto di vista. Eviterei di inserire l'intero oggetto all'interno di ItemInfo
, mantenendo esattamente le proprietà necessarie, in modo da non caricare inutilmente tutti i campi dal database ogni volta.