sql >> Databasteknik >  >> NoSQL >> MongoDB

Använd strängvariabel i LINQ lambda-uttryck

(Detta var originalet som tillhandahålls innan jag insåg att reflektion inte skulle hjälpa i det här fallet. Se redigera nedan för uppdaterat svar)

Om du inte har något emot att använda reflektion kan du göra:

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

REDIGERA

Som andra har antytt i kommentarerna, för att få det här att fungera med MongoDB, måste du bygga uttrycket "för hand".

Så, om jag tar följande påstående:

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

Jag anser att följande borde vara likvärdigt, men bygga lambda-uttrycket för hand:

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

... förutom att du nu borde kunna ändra värdet på propname till valfritt giltigt egenskapsnamn, och det borde bara fungera.

Att titta på hur omfattande koden blir när man bygger lambdas manuellt hjälper mig verkligen att uppskatta all kompilatormagi som händer utan att vi någonsin märker det.



  1. Stäng mongooses anslutning ordentligt när du är klar

  2. Vad är BSON och exakt hur skiljer det sig från JSON?

  3. Var är AccountKey för CosmosDB i Azure Portal

  4. REST AJAX-förfrågan till mongoDB