Come creare un'espressione Linq dinamica basata su lambda da una stringa in C #?

c# dynamic-linq expression-trees lambda linq

Domanda

Sto avendo qualche difficoltà a creare espressioni Linq basate su Lambda da una stringa. Ecco il mio caso base utilizzando questo oggetto / classe di esempio:

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

Fondamentalmente ho bisogno di convertire una stringa come questa:

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

In a a predicate / espressione linq:

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

Quindi è equivalente all'espressione Linq all'interno del metodo Dove di seguito:

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

Ho provato ad usare i seguenti helper ma non riesco a capire come farli funzionare in questo tipo di caso in cui voglio essere in grado di costruire un'espressione linq da una stringa che non è conosciuta in anticipo: 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 (è ora disponibile come Pacchetto NuGet chiamato anche "DynamicQuery"

Risposta accettata

Una domanda simile è stata posta qui:

Esiste un modo semplice per analizzare una stringa (espressione lambda) in un delegato di azione?

A quanto ho capito, questa 'Dynamic Query' è in realtà un framework per il passaggio di restrizioni per una clausola Where senza l'utilizzo di un'espressione lambda.

Il significato di ciò è che le espressioni lambda non sono metodi dinamici, sono metodi anonimi. Se guardi in un assembly, vedrai che le tue espressioni lambda vengono convertite in chiusure con qualsiasi variabile libera come campo. La classe ha un metodo con una corrispondenza che corrisponde al tuo, le variabili di campo vengono assegnate al punto di invocazione.

Un buon modo per pensarci è che implica che l'espressione lambda viene interpretata dal compilatore c # in fase di compilazione e le variabili vengono risolte creando un'istanza di un oggetto da questa classe in fase di esecuzione.

Per dimostrarlo, considera quanto segue:

var myLambda = x => x * x

Noterai che questo non funziona. Questo perché, per creare la relativa classe / metodo, il compilatore deve conoscere, in fase di compilazione, il tipo di x.

Tutto ciò è importante perché la nozione di un'espressione lambda non esiste al CLR in fase di esecuzione (nella stessa forma è nel codice). Una stringa che sembra un'espressione lambda è esattamente quella ...



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é