Выражение равно - PullRequest
       7

Выражение равно

3 голосов
/ 12 сентября 2010

Итак, я пытаюсь выяснить деревья выражений. Я пытаюсь добавить в динамических равных Queryable, где T является одной из нескольких разных таблиц. Сначала я проверяю, в таблице есть поле, которое я хочу отфильтровать.

ParameterExpression param = Expression.Parameter(typeof(TSource), "x");

Expression conversionExpression = Expression.Convert(Expression.Property(param, _sourceProperty), typeof(TList));

Expression<Func<TSource, TList>> propertyExpression = Expression.Lambda<Func<TSource, TList>>(conversionExpression, param);

Expression<Func<TList, TList, bool>> methodExpression = (x, y) => x.Equals(y);

ReadOnlyCollection<ParameterExpression> parameters = propertyExpression.Parameters;

InvocationExpression getFieldPropertyExpression = Expression.Invoke(
                                                propertyExpression,
                                                parameters.Cast<Expression>());

MethodCallExpression methodBody = methodExpression.Body as MethodCallExpression;
MethodCallExpression methodCall = Expression.Call(methodBody.Method, Expression.Constant(equalTo), getFieldPropertyExpression);

Expression<Func<TSource, bool>> equalsStatement = Expression.Lambda<Func<TSource, bool>>(methodCall, parameters);

return source.Where(equalsStatement);

Когда я выполняю это, у меня возникает проблема с MethodInfo в операторе Call. Это говорит мне;

Статический метод требует нулевого экземпляра, нестатический метод требует ненулевого экземпляра.

Я не мастер деревьев экспрессии, но я думаю, что понимаю около 75% того, что я здесь делаю, и знаю, чего я пытаюсь достичь. В настоящее время TList - это плохое имя, но я взял это из примера, который прекрасно работает для создания оператора In.

Я действительно ищу здесь объяснение, чтобы я мог сам проработать код или решение с объяснением того, чего мне не хватало.

Edit:

Хорошо, так что после очень разочаровывающего дня и все еще не совсем ощущения, что я полностью понимаю, на что смотрю, думаю, у меня есть ответ.

ParameterExpression sourceObject = Expression.Parameter(typeof(TSource), "x");

Expression<Func<TSource, bool>> check = Expression.Lambda<Func<TSource, bool>>
        (
            Expression.Equal(
            Expression.MakeMemberAccess(sourceObject, typeof(TSource).GetProperty(_sourceProperty)),
            Expression.Constant(equalTo)
        ),
        sourceObject
);

return source.Where(check);

Кто-нибудь может мне объяснить, почему оригинал просто не подходит для того, что я пытался сделать? Я хочу больше узнать о реальном процессе, но чувствую, что не собираюсь поднимать его так быстро, как хотелось бы.

1 Ответ

3 голосов
/ 12 сентября 2010

Expression.Call имеет два набора перегрузок (с большим количеством перегрузок в каждом). Один набор предназначен для методов экземпляра, а другой - для статических методов. В статических методах первый аргумент - это объект MethodInfo, такой же, как у вас. Для методов instance первый аргумент должен быть выражением, представляющим цель (т. Е. Левую часть "." В вызове метода.) Учитывая полученную ошибку, он звучит как MethodInfo представляет нестатический метод, и поэтому вы должны предоставить выражение, представляющее экземпляр в качестве первого аргумента.

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