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.
Ihr '.Call' verwendet die' MethodInfo' von 'string'. –
schreibe einfachen C# -Code, den du erzeugen willst, wie 'x.Keys [0] .Contains (" a ")' – Rafal
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 –