Tenho uma grade de interface do usuário do Kendo que atualmente estou permitindo a filtragem em várias colunas. Gostaria de saber se existe uma abordagem alternativa para remover a instrução switch externa?
Basicamente, quero criar um método de extensão para poder filtrar um IQueryable<T> e quero descartar a instrução de caso externo para não precisar alterar os nomes das colunas.
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;
}
Algumas informações adicionais, estou usando o NHibernate Linq. Outro problema é que a coluna "Nome" na minha grade é na verdade "Nome" + "" + "Sobrenome" na minha entidade de contato. Também podemos assumir que todas as colunas filtráveis serão cadeias de caracteres.
EDIT Lembre-se de que isso precisa funcionar com o NHibernate Linq e o AST.