Comment créer une expression Linq basée sur le lambda dynamique à partir d'une chaîne en C #?

c# dynamic-linq expression-trees lambda linq

Question

J'ai des difficultés à créer des expressions Linq à base Lambda à partir d'une chaîne. Voici mon cas de base en utilisant cet exemple d'objet / classe:

public class MockClass
{
    public string CreateBy { get; set; }
}

Fondamentalement, j'ai besoin de convertir une chaîne comme ceci:

string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”;

Dans une expression de prédicat / linq:

System.Linq.Expressions.Expression<Func<T, bool>>  or in this example 
System.Linq.Expressions.Expression<Func<MockClass, bool>>

Donc, cela équivaut à l'expression Linq à l'intérieur de la méthode Where ci-dessous:

query = query.Where(x => x.CreateBy.Equals(filter.Value,
StringComparison.OrdinalIgnoreCase));

J'ai essayé d'utiliser les aides suivantes mais je n'arrive pas à comprendre comment les faire fonctionner dans ce type de cas où je veux pouvoir créer une expression linq à partir d'une chaîne inconnue: http: //www.albahari.com/nutshell/predicatebuilder.aspx

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx (il est maintenant disponible en tant que Paquet NuGet également appelé «DynamiqueQuery»)

Réponse acceptée

Une question similaire a été posée ici:

Existe-t-il un moyen simple d’analyser une chaîne (expression lambda) dans un délégué d’action?

Si j'ai bien compris, cette "requête dynamique" est en réalité un cadre permettant de transmettre des restrictions à une clause Where sans utiliser d'expression lambda.

La signification de cela est que les expressions lambda ne sont pas des méthodes dynamiques, elles sont des méthodes anonymes. Si vous consultez un assemblage, vous verrez que vos expressions lambda sont converties en fermetures avec des variables libres en tant que champs. La classe a une méthode avec une signature qui correspond à la vôtre, des variables de champ sont attribuées au moment de l’invocation.

Une bonne façon de penser à cela est que cela implique que votre expression lambda est interprétée par le compilateur c # au moment de la compilation et que les variables sont résolues en instanciant un objet de cette classe à l'exécution.

Pour démontrer cela, considérez les points suivants:

var myLambda = x => x * x

Vous remarquerez que cela ne fonctionne pas. En effet, pour créer la classe / méthode associée, le compilateur doit connaître, au moment de la compilation, le type de x.

Tout cela est important car la notion d'expression lambda n'existe pas au niveau du CLR au moment de l'exécution (sous la même forme, c'est dans le code). Une chaîne qui ressemble à une expression lambda est exactement ça ...



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow