sql >> Database >  >> NoSQL >> MongoDB

Gebruik stringvariabele in LINQ lambda-expressie

(Dit was het origineel dat werd verstrekt voordat ik me realiseerde dat reflectie in dit specifieke geval niet zou helpen. Zie bewerking hieronder voor bijgewerkt antwoord)

Als je het niet erg vindt om reflectie te gebruiken, kun je het volgende doen:

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

BEWERKEN

Zoals anderen in de opmerkingen hebben laten doorschemeren, moet je de uitdrukking "met de hand" bouwen om dit met MongoDB te laten werken.

Dus, als ik de volgende bewering neem:

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

Ik geloof dat het volgende equivalent zou moeten zijn, maar de lambda-expressie met de hand opbouwen:

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

... behalve dat je nu de waarde van propname . zou moeten kunnen veranderen naar elke geldige eigenschapsnaam, en het zou gewoon moeten werken.

Als ik kijk hoe uitgebreid de code wordt bij het handmatig bouwen van lambda's, kan ik echt alle compiler-magie waarderen die gebeurt zonder dat we het ooit merken.



  1. MongoDB Regular Expression Search - Begint met het gebruik van javascript-stuurprogramma en NodeJS

  2. Hoe gebeurtenissen te gebruiken, houd mongodb-logica uit node.js-verzoekhandlers

  3. Inleiding tot Redis-gegevensstructuren:sets

  4. Hoe kan ik gesorteerde gegevens exporteren met mongoexport?