MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Usa la variabile stringa nell'espressione lambda di LINQ

(Questo era l'originale fornito prima di rendersi conto che la riflessione non sarebbe stata di aiuto in questo caso particolare. Vedi la modifica di seguito per la risposta aggiornata)

Se non ti dispiace usare la riflessione, potresti fare:

var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));

MODIFICA

Come altri hanno accennato nei commenti, per farlo funzionare con MongoDB, dovrai creare l'espressione "a mano".

Quindi, se prendo la seguente affermazione:

var data = db.Single<Demo>(d => d.prop1 == "value");

Credo che quanto segue dovrebbe essere equivalente, ma costruendo manualmente l'espressione lambda:

string propname = "prop1"; // you can now change this to any valid property name.

var parameterExpresion = Expression.Parameter(typeof(Demo), "d");
var binaryExpression = Expression.Equal(
    Expression.Property(parameterExpresion, propname),
    Expression.Constant("value"));
var lambda = Expression.Lambda<Func<Demo, bool>>(binaryExpression, parameterExpresion);

var data = db.Single<Demo>(lambda);

... tranne che ora dovresti essere in grado di modificare il valore di propname a qualsiasi nome di proprietà valido e dovrebbe funzionare.

Guardare quanto diventa dettagliato il codice quando si compilano i lambda manualmente mi aiuta davvero ad apprezzare tutta la magia del compilatore che accade senza che ce ne accorgiamo.