2010-07-20 3 views
5

Je travaille sur un code d'arbre d'expression écrit par un collègue et je suis en train d'étudier la possibilité d'ajouter des expressions supplémentaires. Il supporte actuellement: equals, not-equals, IsNull etc. J'ai besoin d'ajouter quelque chose qui lui permettra d'utiliser une comparaison générique similaire à la commande SQL "Like" ou en utilisant des expressions régulières. Au moment où le code analyse un fichier XML et extrait les données qui sont ensuite traitées en utilisant un code similaire à la ligne ci-dessous. Ceci est un exemple de l'expression "Equal". "CallExp" est une MemberExpression qui contient essentiellement le nom de champ de ma table (Entities) et GetConstantExpression obtient des détails sur les données que je compare.Comment créer un arbre d'expression pour faire quelque chose de similaire à la commande SQL "J'aime"

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

Ce que je suis après est un moyen de créer une « expression » qui est similaire à la commande « Like ». Est-ce que cela peut être fait en utilisant quelques lignes similaires à ci-dessus ou cela va-t-il être plus complexe? De bonnes ressources qui pourraient aider dans ce domaine?

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

Nouveau code basé sur les commentaires:

Je regardais quelques exemples et j'ai essayé ce qui suit que j'espérais créer une Expression. Cela me donne l'erreur ci-dessous. Est-ce que je vais dans la bonne direction pour créer une expression "StartsWith"? _entityExp est une référence ParameterExpression à 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éthode 'booléen StartsWith (System.String)' déclarée du type 'System.String' ne peut être appelée avec instance de type 'MyClass de

Répondre

7

arbres d'expression peuvent ne représentent que le même type de fonctionnalité que vous obtenez dans les langages .NET - appels de méthode, évaluation de propriété, etc.

Le plus proche de "like" est d'appeler string.StartsWith, string.EndsWith o r string.Contains. Si vous souhaitez traiter les expressions régulières à la place, vous pouvez utiliser Regex.IsMatch à la place. De toute façon, c'est quelque chose qui est encapsulé dans méthodes plutôt que dans le «langage» des arbres d'expression lui-même. Sans savoir plus sur la façon dont vos arbres d'expression sont consommés, il est difficile de dire exactement ce que vous devriez faire. Vous pouvez créer votre propre méthode "Like" que le consommateur remarquerait et gérerait de manière appropriée, par exemple ... ou vous pourriez utiliser les méthodes string/regex existantes.

+0

J'ai décidé d'essayer de faire fonctionner "StartsWith". J'ai modifié le code ci-dessus, mais je reçois une erreur. Est-ce que je vais dans la bonne direction avec ça? – Retrocoder

+0

@Retrocoder: Non, l'erreur est tout à fait correcte. Vous essayez d'appeler 'string.StartsWith (string)' mais en fournissant un argument non-chaîne. Soit vous devez changer l'argument pour qu'il s'agisse d'une chaîne, soit écrire votre propre méthode 'StartsWith' avec la signature dont vous avez besoin. –

Questions connexes