Динамическая лямбда со всеми свойствами свойства объекта - PullRequest
0 голосов
/ 16 ноября 2010

Я задал вопрос о том, как динамически компилировать запрос LINQ со всеми свойствами объекта, и houlgap был достаточно любезен, чтобы дать мне следующий код

    private static Func<MyEntity, bool> GenerateLambda(MyEntity _myEntity, PropertyInfo propertyInfo)
{
    var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
    var property = Expression.Property(instance, propertyInfo);
    var propertyValue = Expression.Constant(propertyInfo.GetValue(_myEntity, null));
    var equalityCheck = Expression.Equal(property, propertyValue);
    return Expression.Lambda<Func<MyEntity, bool>>(equalityCheck, instance).Compile();
}

Это прекрасно работает, если свойствоБыть запрошенным - это непосредственно член объекта, но для меня между ними есть промежуточное свойство.Например, Func Delegate для другого типа, например Func <ABCMyEntity,bool>, в то время как MyEntity является членом этого объекта (ABCMyEntity.MyEntity).Переданный объект Propertyinfo является членом MyEntity.

Я знаю, это звучит ужасно странно, но я не могу лучше объяснить это.(Может потому что я не носитель языка).Пожалуйста, спросите меня, если что-то не ясно в вопросе.

Продолжение с Построение динамических запросов LINQ со всеми свойствами объекта

1 Ответ

0 голосов
/ 16 ноября 2010

Если вам нужен доступ к цепочке свойств (например, v.MyEntity.OtherProperty), вы можете просто позвонить Expression.Property несколько раз:

var prop1 = // first property
var prop2 = // second property

// Variable has type of the declarating type of the 1st property
var instance = Expression.Parameter(prop1.DeclaringType, "i"); 

// Get first property on the 'instance'
var expr1 = Expression.Property(instance, prop1); 
// Get second property on the previous expression
var expr2 = Expression.Property(expr, prop2); 

// The rest of the code stays the same (only use 'expr2')
var propertyValue = Expression.Constant(propertyInfo.GetValue(_myEntity, null)); 
var equalityCheck = Expression.Equal(expr2, propertyValue); 
return Expression.Lambda<Func<MyEntity, bool>>
  (equalityCheck, instance).Compile(); 

Если вам нужно получить доступ более чем к двум свойствам, вы можете легко превратить часть, которая вызывает Expression.Property, в цикл - вы просто перебираете список требуемых свойств и добавляете доступ к свойству выражения, используя Expression.Property .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...