C# 更改MethodCallExpression中的参数

C# 更改MethodCallExpression中的参数,c#,iqueryable,linq-expressions,C#,Iqueryable,Linq Expressions,我有一个表达式查询,目标是IQueryable。 在expression visitor中,我将queryable源代码替换为IQueryable。 执行查询时,我收到异常: “WebMessage”类型的表达式不能用于方法“Int32计数[WebMessageDto](WebMessageDto])的“WebMessageDto”类型的参数 我可以替换此表达式中的类类型吗? WebMessage和WebMessageDto具有相同的字段 其思想是处理对WebMessageDto的查询,在Web

我有一个表达式查询,目标是
IQueryable
。 在expression visitor中,我将queryable源代码替换为
IQueryable
。 执行查询时,我收到异常:

“WebMessage”类型的表达式不能用于方法“Int32计数[WebMessageDto](WebMessageDto])的“WebMessageDto”类型的参数

我可以替换此表达式中的类类型吗?
WebMessage
WebMessageDto
具有相同的字段

其思想是处理对WebMessageDto的查询,在WebMessage数据源上执行它,然后将结果转换为WebMessageDto并返回它

我试图更改MethodCallExpression中的参数,但出现异常

    protected override Expression VisitMethodCall(MethodCallExpression node)
    {
        if (node.Method.Name == "Count")
        {
            //Expression.Convert(node.Arguments[0], typeof(WebMessage));

            //List<ConstantExpression> newArgs = new List<ConstantExpression>()
            //{
            //    Expression.Constant(typeof(WebMessage)
            //};
            //
            //node.Update(node.Object, newArgs);
        }

        return node;
    }
受保护的重写表达式VisitMethodCall(MethodCallExpression节点)
{
if(node.Method.Name==“Count”)
{
//Convert(node.Arguments[0],typeof(WebMessage));
//List newArgs=newlist()
//{
//Expression.Constant(typeof(WebMessage)
//};
//
//node.Update(node.Object,newArgs);
}
返回节点;
}

So,node.Arguments[0]是WebMessageDto类型吗?@Markus是的。我想整个查询的目标是
WebMessageDto
…您是否定义了一个类型转换器,知道如何在WebMessage和WebMessageDto之间进行转换?@Markus没有,您有什么例子吗?
TypeConverter
与这里的问题无关。您至少需要:first、 在方法调用中将
IQueryable
对象替换为
IQueryable
;其次,将
LambdaExpression.Arguments
中原始的
ParameterExpression
替换为
WebMessage
类型的
ParameterExpression
(例如,与另一个访问者一起);第三,如果返回值取决于元素类型,则必须将返回值从
WebMessage
转换回
WebMessageDto
。在任何情况下,都需要知道支持的查询有多复杂。