sql >> Base de Datos >  >> NoSQL >> MongoDB

Usar variable de cadena en la expresión lambda de LINQ

(Este fue el original provisto antes de darse cuenta de que la reflexión no ayudaría en este caso particular. Consulte la edición a continuación para obtener una respuesta actualizada)

Si no te importa usar la reflexión, puedes hacer:

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

EDITAR

Como otros han insinuado en los comentarios, para que esto funcione con MongoDB, tendrá que construir la expresión "a mano".

Entonces, si tomo la siguiente declaración:

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

Creo que lo siguiente debería ser equivalente, pero construyendo la expresión lambda a mano:

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

... excepto que ahora debería poder cambiar el valor de propname a cualquier nombre de propiedad válido, y debería funcionar.

Ver qué tan detallado se vuelve el código cuando se construyen lambdas manualmente realmente me ayuda a apreciar toda la magia del compilador que sucede sin que nos demos cuenta.