Ho una griglia dell'interfaccia utente Kendo che attualmente sto permettendo il filtraggio su più colonne. Mi chiedo se esiste un approccio alternativo che rimuove l'istruzione switch esterno?
Fondamentalmente voglio poter creare un metodo di estensione in modo da poter filtrare su IQueryable<T>
e voglio rilasciare la dichiarazione case esterna in modo da non dover cambiare i nomi delle colonne.
private static IQueryable<Contact> FilterContactList(FilterDescriptor filter, IQueryable<Contact> contactList)
{
switch (filter.Member)
{
case "Name":
switch (filter.Operator)
{
case FilterOperator.StartsWith:
contactList = contactList.Where(w => w.Firstname.StartsWith(filter.Value.ToString()) || w.Lastname.StartsWith(filter.Value.ToString()) || (w.Firstname + " " + w.Lastname).StartsWith(filter.Value.ToString()));
break;
case FilterOperator.Contains:
contactList = contactList.Where(w => w.Firstname.Contains(filter.Value.ToString()) || w.Lastname.Contains(filter.Value.ToString()) || (w.Firstname + " " + w.Lastname).Contains( filter.Value.ToString()));
break;
case FilterOperator.IsEqualTo:
contactList = contactList.Where(w => w.Firstname == filter.Value.ToString() || w.Lastname == filter.Value.ToString() || (w.Firstname + " " + w.Lastname) == filter.Value.ToString());
break;
}
break;
case "Company":
switch (filter.Operator)
{
case FilterOperator.StartsWith:
contactList = contactList.Where(w => w.Company.StartsWith(filter.Value.ToString()));
break;
case FilterOperator.Contains:
contactList = contactList.Where(w => w.Company.Contains(filter.Value.ToString()));
break;
case FilterOperator.IsEqualTo:
contactList = contactList.Where(w => w.Company == filter.Value.ToString());
break;
}
break;
}
return contactList;
}
Alcune informazioni aggiuntive, sto usando NHibernate Linq. Inoltre un altro problema è che il La colonna "Nome" sulla mia griglia è in realtà "Nome" + "" + "Cognome" nella mia entità di contatto. Possiamo anche assumere che tutte le colonne filtrabili saranno stringhe.
EDIT Ricorda che questo deve funzionare con NHibernate Linq e AST.