MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Utiliser la variable de chaîne dans l'expression lambda LINQ

(Il s'agissait de l'original fourni avant de réaliser que la réflexion n'aiderait pas dans ce cas particulier. Voir la modification ci-dessous pour une réponse mise à jour)

Si cela ne vous dérange pas d'utiliser la réflexion, vous pouvez faire :

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

MODIFIER

Comme d'autres l'ont laissé entendre dans les commentaires, pour que cela fonctionne avec MongoDB, vous devrez créer l'expression "à la main".

Donc, si je prends la déclaration suivante :

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

Je pense que ce qui suit devrait être équivalent, mais en construisant l'expression lambda à la main :

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

... sauf que maintenant, vous devriez pouvoir changer la valeur de propname à n'importe quel nom de propriété valide, et cela devrait fonctionner.

Regarder à quel point le code devient verbeux lors de la construction manuelle de lambdas m'aide vraiment à apprécier toute la magie du compilateur qui se produit sans que nous ne le remarquions jamais.