2010-07-20 10 views
5

Estoy trabajando en un código de árbol de expresiones escrito por un colega y estoy buscando la posibilidad de agregar expresiones adicionales. Actualmente admite: iguales, no iguales, IsNull, etc. Necesito agregar algo que le permita usar una comparación comodín similar al comando SQL "Me gusta" o usar expresiones regulares. Por el momento, el código analiza un archivo XML y extrae los datos que luego se procesan usando un código similar a la línea que se muestra a continuación. Este es un ejemplo de la expresión "Igual". "CallExp" es una MemberExpression que básicamente contiene el nombre de campo de mi tabla (Entities) y GetConstantExpression obtiene detalles sobre los datos que estoy comparando.Cómo crear un árbol de expresiones para hacer algo similar al comando SQL "Me gusta"

xRet = Expression.MakeBinary(ExpressionType.Equal, callExp, GetConstantExpression(element.Element("Value"), callExp.Type)); 

lo que busco es una manera de crear una “expresión” que es similar al comando “Me gusta”. ¿Se puede hacer esto usando unas líneas similares a las anteriores o será más complejo? ¿Algún buen recurso que podría ayudar en esta área?

============================================== ====================================

nuevo código basado en la retroalimentación:

Estaba viendo algunos ejemplos e intenté lo siguiente, que esperaba que me creara una Expresión. Me da el error que se muestra a continuación. ¿Voy en la dirección correcta para crear una expresión "StartsWith"? _entityExp es una referencia de ParameterExpression a MyClass.

ParameterExpression p = Expression.Parameter(_entityExp.Type, "entity"); 
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) }); 
var containsMethodExp = Expression.Call(p, method, Expression.Constant("root"), p); 

Método 'booleana StartsWith (System.String)' declarada el tipo 'System.String' no puede ser llamado con instancia de tipo 'MiClase'

Respuesta

7

árboles de expresión pueden solo represente el mismo tipo de funcionalidad que obtiene en los lenguajes .NET - llamadas a métodos, evaluación de propiedades, etc.

Lo más parecido a "me gusta" que le queda normalmente es llamar al string.StartsWith, string.EndsWith o r string.Contains. Si desea tratar con expresiones regulares en su lugar, es posible que desee utilizar Regex.IsMatch en su lugar. De cualquier manera, esto es algo que está encapsulado en métodos en lugar de en el "lenguaje" de los árboles de expresiones en sí.

Sin saber más acerca de cómo se consumen los árboles de expresión, es difícil decir exactamente lo que debe hacer. Usted podría crear su propio método "Me gusta" que el consumidor notaría y manejaría apropiadamente, por ejemplo ... o podría usar los métodos de cadena/expresiones regulares existentes.

+0

He decidido probar el funcionamiento de "StartsWith". He editado el código anterior, pero recibo un error. ¿Estoy yendo en la dirección correcta con esto? – Retrocoder

+0

@Retrocoder: No, el error es bastante correcto. Está intentando llamar a 'string.StartsWith (string)' pero suministrando un argumento que no es de cadena. O bien debe cambiar el argumento para que sea una cadena o escribir su propio método 'StartsWith' con la firma que necesita. –

Cuestiones relacionadas