2017-01-24 4 views
1

J'essaie de générer une expression linq dans le noyau asp.net pour MongoDB en utilisant le MongoDriver et je peux ' t accéder à la valeur d'exécution d'un dicton avec le générateur d'expression. Merci d'avance! Ce que j'essaie d'accomplir est la clause where de la requête pour obtenir toutes les données pour un rapport.Je n'arrive pas à accéder à une valeur Dictonary <string, object> lors de la construction d'une expression linq dynamique

Expresssiom, qui devrait être créé à la suite de la méthode devrait ressembler à:

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

votre '.Call' utilise le' MethodInfo' de 'string'. –

+0

écrivez plain C# code que vous visez à générer comme 'x.Keys [0] .Contains (" a ")' – Rafal

+0

Pourriez-vous expliquer, que voulez-vous réaliser? Je ne comprends pas, et je ne vois pas comment il pourrait être utilisé pour la requête mongodb –

Répondre

1

Ok, vous avez besoin de changer votre méthode de cette façon:

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

Je l'ai testé avec mon mongodriver et ça a l'air de marcher. En fait, pour obtenir des éléments du dictionnaire, vous devez appeler la propriété Item (Building Expression Tree Using a Parameter's Indexer). Mais soit je l'ai mal utilisé, ou le pilote MongoDb ne pouvait pas le traduire correctement, donc je le fais en appelant la méthode get_Item, ce qui est la même chose.