C # Expression dynamique sur un objet dynamique

c# expression expression-trees

Question

Supposons le scénario suivant:

J'ai deux cours:

public class Customer
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}


public class Employee
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

et alors je peux avoir:

List<Customer> customers = new List<Customer>();

List<Employee> employees = new List<Employee>();

Maintenant, je peux avoir comme ça:

public static List<Employee> GetMajorEmployees(this List<Employee> employees)
{
    return employees.Where(t=>t.Age >= 18).ToList();
}

Mais qu'en est-il au lieu d'exécuter la requête dans le code, demandez à l'utilisateur de la définir dans l'interface utilisateur et de l'exécuter côté serveur de la manière suivante:

 public static List<T> RunCustomQuery<T>(this List<T> items, dynamic query)
{
    return items.ExecuteQuery(query); // to be implemented
}

query est l'expression réelle construite dans l'interface utilisateur par l'utilisateur et enregistrée dans la base de données.

Comment créer une expression dynamique sur les listes et l'enregistrer dans une base de données au format texte, json ou xml?

Sur l'interface utilisateur, l'utilisateur peut sélectionner / créer la requête. Pour une liste de clients, la requête peut être quelque chose comme:

customers.Where(t=>t.FirstName == "Jhon");

De plus, je veux pouvoir extraire automatiquement les propriétés de l'objet dynamique, car vous pouvez voir que les deux classes ont les mêmes propriétés mais aussi des propriétés différentes.

Quelqu'un peut-il me diriger dans la bonne direction?

Ce dont j'ai besoin est quelque chose comme TFS a:

entrez la description de l'image ici

Réponse acceptée

Vous pouvez utiliser Expression pour cela. Il vous permet de mettre en place un arbre d’expression et de le compiler. Vous pouvez ensuite l’utiliser comme Func ou Action partout où vous utilisez lambdas.

Ou, si vous ne le compilez pas, vous pouvez l'interpréter ou l'inspecter de toute autre manière.

Il existe certains projets open source qui vous permettent de sérialiser et de désérialiser Expressions, mais je n’en ai utilisé aucun, je ne peux donc pas faire de recommandations.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi