MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Use a variável de string na expressão lambda LINQ


(Este foi o original fornecido antes de perceber que a reflexão não ajudaria neste caso específico. Veja a edição abaixo para obter uma resposta atualizada)

Se você não se importa de usar reflexão, você pode fazer:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));

EDITAR

Como outros sugeriram nos comentários, para fazer isso funcionar com o MongoDB, você terá que construir a expressão "à mão".

Então, se eu pegar a seguinte afirmação:
var data = db.Single<Demo>(d => d.prop1 == "value");

Acredito que o seguinte deva ser equivalente, mas construindo a expressão lambda manualmente:
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);

... exceto que agora, você deve poder alterar o valor de propname para qualquer nome de propriedade válido e deve funcionar.

Observar o quão detalhado o código fica ao construir lambdas manualmente realmente me ajuda a apreciar toda a mágica do compilador que acontece sem que percebamos.