Итак, я пытаюсь выяснить деревья выражений. Я пытаюсь добавить в динамических равных 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);
Кто-нибудь может мне объяснить, почему оригинал просто не подходит для того, что я пытался сделать? Я хочу больше узнать о реальном процессе, но чувствую, что не собираюсь поднимать его так быстро, как хотелось бы.