Tengo una cuadrícula de interfaz de usuario de Kendo que actualmente estoy permitiendo filtrar en varias columnas. Me pregunto si hay un enfoque alternativo para eliminar la declaración del interruptor externo.
Básicamente, quiero poder crear un método de extensión para poder filtrar IQueryable<T>
y quiero eliminar la declaración de mayúsculas y minúsculas para no tener que cambiar los nombres de columna.
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;
}
Alguna información adicional, estoy usando NHibernate Linq. También otro problema es que la columna "Nombre" en mi cuadrícula es en realidad "Nombre" + "" + "Apellido" en mi entidad de contacto. También podemos suponer que todas las columnas filtrables serán cadenas.
EDITAR Recuerde que esto debe funcionar con NHibernate Linq y AST.
c#
design-patterns
Rippo
fuente
fuente
Respuestas:
Respondiendo tu pregunta específica ,
En el caso de "Nombre", lo llamas como;
Debe agregar una sobrecarga como,
Entonces puede llamarlo así para el campo "Compañía".
Esto evita la sobrecarga de obligar a la persona que llama a crear una matriz cuando solo tiene la intención de seleccionar un Campo / Propiedad.
Lo que probablemente buscas es algo como sigue
Para eliminar esa lógica por completo alrededor de la definición
selector
ypredicate
necesita más información sobre cómo se construye el filtro. Si es posible, el filtro debe tener las propiedadesselector
ypredicate
como para que FilterContactList use que se construyen automáticamente.Ampliando eso un poco,
Tu
FilterContactList
entonces se convertiríafuente
2[Domain.Model.Entities.Contact,System.Collections.Generic.IEnumerable
1 [System.String]]), contact) .Any (value (System.Func`2 [System.String, System .Boolean])) ': El objeto del tipo' System.Linq.Expressions.ConstantExpression 'no se puede convertir al tipo' System.Linq.Expressions.LambdaExpression '. Si intentó pasar un delegado en lugar de una LambdaExpression, esto no es compatible porque los delegados no son expresiones analizables.Creo que una manera simple de hacer esto sería crear un mapa de nombres de propiedades para Func:
p.ej
Y cambie su código a:
También puede eliminar el interruptor por completo creando una búsqueda para la función de coincidencia:
Entonces, para poner todo junto:
NB: ¿No es redundante verificar c.Primer Nombre si también está verificando (c.Primer Nombre + "" c.LastName)?
fuente
System.InvalidCastException Unable to cast object of type 'NHibernate.Hql.Ast.HqlParameter' to type 'NHibernate.Hql.Ast.HqlBooleanExpression'.