【问题标题】:How to parse expression tree to extract a type condition OfType如何解析表达式树以提取类型条件 OfType
【发布时间】:2014-03-03 09:31:04
【问题描述】:

我正在尝试实现 Queryable 接口,我想从表达式中提取类型。

我已经使用http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx 中的示例实现了 Queryable。

当我到达我的 Provider 中的 Execute 方法时,表达式是:

expression = {value(TestApp.HouseQueryable`1[TestApp.House]).OfType().Where(i => (i.Address == "N.125 Oxford St."))}

第一个参数似乎是类型,但从那里我不知道如何从 OfType() 方法中提取它。有人可以帮我吗?

构建可查询和查询提供程序的代码是教程中的代码。

谢谢

编辑:为了进一步扩展我的目标,我想根据给定的类型从不同的服务中查询。我知道这不是最好的方法,因为我最终会在我的查询提供程序中拥有一个很大的 IF ELSE。

根据 Ani 的响应,我从 ExpressionVisitor 继承并检查方法调用以提取类型。我只测试了只有一个 .OfType() 的场景,它似乎可以工作。

public class ExpressionTreeModifier : ExpressionVisitor
{
    public ExpressionTreeModifier(Expression expression)
    {
        this.Visit(expression);
    }

    protected override Expression VisitMethodCall(MethodCallExpression methodCall)
    {
        var method = methodCall.Method;
        if (method.Name == "OfType" && method.DeclaringType == typeof(Queryable))
        {
            var type = method.GetGenericArguments().Single();
            OfType = (Type)type;
        }
        return base.VisitMethodCall(methodCall);
    }

    public Type OfType { get;set; }
}

【问题讨论】:

    标签: c# expression iqueryable


    【解决方案1】:

    我不确定你到底要去哪里,但回答你的问题(仅此而已):

    IQueryable queryable = ...
    
    var methodCall = queryable.Expression as MethodCallExpression;
    
    if(methodCall != null)
    {
       var method = methodCall.Method;
    
       if(method.Name == "OfType" && method.DeclaringType == typeof(Queryable))
       {
          var type = method.GetGenericArguments().Single();
          Console.WriteLine("OfType<{0}>", type);
       }
    }
    

    说实话,不确定这段高度具体的代码将如何帮助您编写自己的查询提供程序。您能否扩展一下您的更广泛的目标?

    【讨论】:

    • 谢谢,它回答了我的需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多