MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verwenden Sie eine Zeichenfolgenvariable im LINQ-Lambda-Ausdruck

(Dies war das Original, das bereitgestellt wurde, bevor erkannt wurde, dass Reflexion in diesem speziellen Fall nicht helfen würde. Siehe Bearbeiten unten für eine aktualisierte Antwort)

Wenn es Ihnen nichts ausmacht, Reflektion zu verwenden, können Sie Folgendes tun:

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

BEARBEITEN

Wie andere in den Kommentaren angedeutet haben, müssen Sie den Ausdruck "von Hand" erstellen, damit dies mit MongoDB funktioniert.

Also, wenn ich die folgende Aussage nehme:

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

Ich glaube, dass Folgendes äquivalent sein sollte, aber den Lambda-Ausdruck von Hand erstellt:

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

... außer dass Sie jetzt in der Lage sein sollten, den Wert von propname zu ändern zu jedem gültigen Eigenschaftsnamen, und es sollte einfach funktionieren.

Wenn ich mir anschaue, wie ausführlich der Code wird, wenn Lambdas manuell erstellt werden, hilft mir das wirklich, all die Compiler-Magie zu schätzen, die passiert, ohne dass wir es jemals bemerken.