sql >> データベース >  >> NoSQL >> MongoDB

LINQラムダ式で文字列変数を使用する

    (これは、この特定のケースではリフレクションが役に立たないことに気付く前に提供されたオリジナルでした。更新された回答については、以下の編集を参照してください)

    リフレクションを使用してもかまわない場合は、次のことができます。

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

    編集

    他の人がコメントで示唆しているように、これをMongoDBで機能させるには、「手作業で」という表現を作成する必要があります。

    したがって、次のステートメントを使用すると、次のようになります。

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

    以下は同等である必要があると思いますが、ラムダ式を手動で作成します:

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

    ...これで、propnameの値を変更できるようになります。 任意の有効なプロパティ名に変更すると、正常に機能するはずです。

    ラムダを手動でビルドするときにコードがどのように冗長になるかを見ると、気付かないうちに発生するすべてのコンパイラの魔法を理解するのに役立ちます。



    1. rediskeysコマンドで「OR」条件を適用する方法

    2. Mongoの1つのパイプラインでいくつかのコレクションを結合して並べ替える方法

    3. redisでグローバルTTLを設定できますか?

    4. C#MongoDeleteMany-クラスを使用しない