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.
votre '.Call' utilise le' MethodInfo' de 'string'. –
écrivez plain C# code que vous visez à générer comme 'x.Keys [0] .Contains (" a ")' – Rafal
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 –