C # Espressione dinamica su oggetto dinamico

c# expression expression-trees

Domanda

Assumiamo il seguente scenario:

Ho due classi:

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; }
}

e poi posso avere:

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

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

Ora posso avere questo:

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

Ma cosa succede invece di eseguire la query nel codice, avere l'utente definirlo nell'interfaccia utente ed eseguirlo sul lato server come questo:

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

Dove query è l'espressione reale costruita nell'interfaccia utente dall'utente e salvata nel database.

Come posso creare un'espressione dinamica negli elenchi e salvarla nel database come testo o json o xml?

Sull'interfaccia utente l'utente può selezionare / creare la query. Per la lista dei clienti la query può essere qualcosa come:

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

Inoltre voglio essere in grado di estrarre le proprietà automaticamente dall'oggetto dinamico, come puoi vedere le due classi hanno le stesse proprietà ma anche alcune diverse.

Qualcuno può indicarmi la giusta direzione?

Quello di cui ho bisogno è qualcosa come TFS ha:

inserisci la descrizione dell'immagine qui

Risposta accettata

Puoi usare Espressione per questo. Ti consente di mettere insieme un albero di espressioni e di compilarlo e quindi puoi usarlo come Func o Action ovunque tu usi lambda.

Oppure, se non lo compili, puoi interpretarlo o ispezionarlo in qualsiasi altro modo.

Ci sono alcuni progetti open source che ti permettono di serializzare e deserializzare le espressioni, ma non le ho mai usate, quindi non posso dare consigli.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché