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

Brug strengvariabel i LINQ lambda-udtryk

(Dette var originalen, før man indså, at refleksion ikke ville hjælpe i dette særlige tilfælde. Se redigering nedenfor for opdateret svar)

Hvis du ikke har noget imod at bruge refleksion, kan du gøre:

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

REDIGER

Som andre har antydet i kommentarerne, for at få dette til at fungere med MongoDB, skal du bygge udtrykket "i hånden".

Så hvis jeg tager følgende udsagn:

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

Jeg mener, at følgende burde være ækvivalent, men at bygge lambda-udtrykket i hånden:

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

... bortset fra at du nu skulle være i stand til at ændre værdien af ​​propname til et hvilket som helst gyldigt ejendomsnavn, og det skulle bare fungere.

At se på, hvor omfattende koden bliver, når man bygger lambdaer manuelt, hjælper mig virkelig med at værdsætte al den kompilatormagi, der sker, uden at vi nogensinde bemærker det.



  1. Sådan kontrolleres, om Mongos $addToSet var en dublet eller ej

  2. mongodb skemadesign til blogs

  3. Sådan konfigurerer du Yii2 med Redis-konfiguration

  4. Hvordan udføres opdateringsoperationer i GridFS (ved hjælp af Java)?