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
。在任何情况下,都需要知道支持的查询有多复杂。