2017-01-24 1 views
1

Я пытаюсь создать выражение linq в ядре asp.net для MongoDB, используя MongoDriver, и я могу " t получить доступ к времени выполнения диктатора с помощью генератора выражений. Заранее спасибо!Я не могу получить доступ к значениям Dictonary <string, object> при построении динамического выражения linq

private Expression<Func<Dictionary<string, object>, bool>> GenerateWhereExpression(Dictionary<string, object> filterParams) 
{ 
    var pe = Expression.Parameter(typeof(Dictionary<string, object>), "x"); 
    var dictPropery = Expression.PropertyOrField(pe, "name"); // Dictonary value with respect to the name key 
    var methodCall = Expression.Call(dictPropery, typeof(string).GetMethod("Contains"), Expression.Constant(filterParams["name"], typeof(string))); 
    var lambda = Expression.Lambda<Func<Dictionary<string, object>, bool>>(methodCall, pe); 
    return lambda; 
} 

То, что я пытаюсь выполнить, - это предложение where, чтобы получить все данные для отчета.

Expresssiom, которые должны быть созданы в результате метода должен выглядеть следующим образом:

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

Ваш '.Call' использует' MethodInfo' из 'string'. –

+0

напишите простой код C#, который вы хотите сгенерировать как 'x.Keys [0] .Contains (" a ")' – Rafal

+0

Не могли бы вы объяснить, чего вы хотите достичь? Я этого не понимаю, и я не понимаю, как его можно использовать для запроса mongodb –

ответ

1

Хорошо, вы должны изменить свой метод так:

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

Я проверил это с моим mongodriver и, похоже, работает. На самом деле, для получения предметов из словаря вам необходимо позвонить Item (Building Expression Tree Using a Parameter's Indexer). Но либо я использовал его неправильно, либо драйвер MongoDb не смог его правильно перевести, поэтому я делаю это с помощью метода get_Item, что то же самое.

Смежные вопросы