sql >> Databáze >  >> NoSQL >> MongoDB

Použijte řetězcovou proměnnou ve výrazu LINQ lambda

(Toto byl originál poskytnutý předtím, než jsme si uvědomili, že reflexe by v tomto konkrétním případě nepomohla. Aktualizovanou odpověď naleznete v úpravě níže)

Pokud vám nevadí používat reflexi, můžete:

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

UPRAVIT

Jak již naznačili ostatní v komentářích, aby to fungovalo s MongoDB, budete muset vytvořit výraz "ručně".

Pokud tedy vezmu následující prohlášení:

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

Domnívám se, že následující by mělo být ekvivalentní, ale ruční vytváření výrazu lambda:

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

... až na to, že nyní byste měli být schopni změnit hodnotu propname na jakýkoli platný název vlastnosti a mělo by to fungovat.

Když se podívám na to, jak podrobný je kód při ručním sestavování lambd, opravdu mi pomáhá ocenit všechna ta kouzla kompilátoru, která se děje, aniž bychom si toho všimli.



  1. zavolejte kolekci mongo pomocí proměnné

  2. Připojení k DocumentDB z AWS Lambda pomocí Pythonu

  3. $ Composer nemůže najít rozšíření mongodb, je vyžadováno rozšíření Mongodb

  4. jak aktualizovat pole vnořeného objektu v mongodb?