所以,我正在尝试找出表达式树。我试图添加动态等于可查询,其中 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);
当我执行此操作时,我在 Call 语句中遇到 MethodInfo 问题。它告诉我;
静态方法需要空实例,非静态方法需要非空实例。
我不是表达式树的大师,但我想我了解我在这里所做的大约 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);
有人能向我解释为什么原版不适合我想做的事情吗?我想更多地了解实际过程,但我觉得我没有像我希望的那样快地掌握它。