2017-01-24 1 views
1

Ich versuche, eine Linq Ausdruck in asp.net Kern für MongoDB mit dem MongoDriver zu generieren und ich kann ' t Mit dem Ausdruckgenerator auf den Laufzeitwert eines Diktons zugreifen. Danke im Voraus!Ich kann nicht in der Lage sein, auf einen Dictonary <string, object> Werte beim Erstellen eines dynamischen linq Ausdruck

Was ich versuche zu erreichen, ist die Where-Klausel der Abfrage, um alle Daten für einen Bericht zu erhalten.

Expresssiom, die als Ergebnis des Verfahrens geschaffen werden sollte wie folgt aussehen sollte:

x => ((string)x["name"]).Contains(term) 
+1

Ihr '.Call' verwendet die' MethodInfo' von 'string'. –

+0

schreibe einfachen C# -Code, den du erzeugen willst, wie 'x.Keys [0] .Contains (" a ")' – Rafal

+0

Könntest du erklären, was du erreichen willst? Ich verstehe es nicht, und ich sehe nicht, wie es für mongodb Abfrage verwendet werden könnte –

Antwort

1

Ok, müssen Sie Ihre Methode, um diese Art und Weise zu ändern:

private Expression<Func<Dictionary<string, object>, bool>> 
        GenerateWhereExpression(Dictionary<string, object> filterParams) 
{ 
    var pe = Expression.Parameter(typeof(Dictionary<string, object>), "x"); 
    // it is call of x.getItem("name") what is the same as x["name"] 
    var dictPropery = Expression.Call(pe, 
      typeof(Dictionary<string, object>).GetMethod("get_Item"), 
      Expression.Constant("name")); 

    //cast to ((string)x.getItem("name")) 
    var castProperty = Expression.Convert(dictPropery, typeof(string)); 
    var methodCall = Expression.Call(castProperty, 
        typeof(string).GetMethod("Contains"), 
        Expression.Constant(filterParams["name"], typeof(string))); 
    var lambda = Expression.Lambda<Func<Dictionary<string, object>, bool>>(methodCall, pe); 
    return lambda; 
} 

ich es getestet habe mit meinem Mongodriver und es scheint zu funktionieren. Eigentlich, um Artikel aus dem Wörterbuch zu bekommen, müssen Sie Item Eigenschaft (Building Expression Tree Using a Parameter's Indexer) aufrufen. Aber entweder habe ich es falsch verwendet, oder der MongoDb-Treiber konnte es nicht richtig übersetzen, also mache ich es get_Item Methode aufrufen, was das Gleiche ist.

Verwandte Themen