Example #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ExpressionTreeParser"/> class with a custom <see cref="INodeTypeProvider"/> and
        /// <see cref="IExpressionTreeProcessor"/> implementation.
        /// </summary>
        /// <param name="nodeTypeProvider">The <see cref="INodeTypeProvider"/> to use when parsing <see cref="Expression"/> trees. Use
        /// <see cref="CreateDefaultNodeTypeProvider"/> to create an instance of <see cref="CompoundNodeTypeProvider"/> that already includes all
        /// default node types. (The <see cref="CompoundNodeTypeProvider"/> can be customized as needed by adding or removing
        /// <see cref="CompoundNodeTypeProvider.InnerProviders"/>).</param>
        /// <param name="processor">The <see cref="IExpressionTreeProcessor"/> to apply to <see cref="Expression"/> trees before parsing their nodes. Use
        /// <see cref="CreateDefaultProcessor"/> to create an instance of <see cref="CompoundExpressionTreeProcessor"/> that already includes
        /// the default steps. (The <see cref="CompoundExpressionTreeProcessor"/> can be customized as needed by adding or removing
        /// <see cref="CompoundExpressionTreeProcessor.InnerProcessors"/>).</param>
        public ExpressionTreeParser(INodeTypeProvider nodeTypeProvider, IExpressionTreeProcessor processor)
        {
            ArgumentUtility.CheckNotNull("nodeTypeProvider", nodeTypeProvider);
            ArgumentUtility.CheckNotNull("processor", processor);

            _nodeTypeProvider           = nodeTypeProvider;
            _processor                  = processor;
            _methodCallExpressionParser = new MethodCallExpressionParser(_nodeTypeProvider);
        }
    public void SetUp ()
    {
      _methodInfoBasedNodeTypeRegistry = new MethodInfoBasedNodeTypeRegistry ();

      _methodInfoBasedNodeTypeRegistry.Register (WhereExpressionNode.GetSupportedMethods(), typeof (WhereExpressionNode));
      _methodInfoBasedNodeTypeRegistry.Register (SelectExpressionNode.GetSupportedMethods(), typeof (SelectExpressionNode));
      _methodInfoBasedNodeTypeRegistry.Register (TakeExpressionNode.GetSupportedMethods(), typeof (TakeExpressionNode));
      _methodInfoBasedNodeTypeRegistry.Register (CountExpressionNode.GetSupportedMethods(), typeof (CountExpressionNode));
      _methodInfoBasedNodeTypeRegistry.Register (JoinExpressionNode.GetSupportedMethods(), typeof (JoinExpressionNode));

      _parser = new MethodCallExpressionParser (_methodInfoBasedNodeTypeRegistry);

      _source = ExpressionNodeObjectMother.CreateMainSource();
    }
 /// <summary>
 /// Initializes a new instance of the <see cref="ExpressionTreeParser"/> class with a custom <see cref="INodeTypeProvider"/> and 
 /// <see cref="IExpressionTreeProcessor"/> implementation.
 /// </summary>
 /// <param name="nodeTypeProvider">The <see cref="INodeTypeProvider"/> to use when parsing <see cref="Expression"/> trees. Use 
 /// <see cref="CreateDefaultNodeTypeProvider"/> to create an instance of <see cref="CompoundNodeTypeProvider"/> that already includes all
 /// default node types. (The <see cref="CompoundNodeTypeProvider"/> can be customized as needed by adding or removing 
 /// <see cref="CompoundNodeTypeProvider.InnerProviders"/>).</param>
 /// <param name="processor">The <see cref="IExpressionTreeProcessor"/> to apply to <see cref="Expression"/> trees before parsing their nodes. Use
 /// <see cref="CreateDefaultProcessor"/> to create an instance of <see cref="CompoundExpressionTreeProcessor"/> that already includes
 /// the default steps. (The <see cref="CompoundExpressionTreeProcessor"/> can be customized as needed by adding or removing 
 /// <see cref="CompoundExpressionTreeProcessor.InnerProcessors"/>).</param>
 public ExpressionTreeParser (INodeTypeProvider nodeTypeProvider, IExpressionTreeProcessor processor)
 {
   ArgumentUtility.CheckNotNull ("nodeTypeProvider", nodeTypeProvider);
   ArgumentUtility.CheckNotNull ("processor", processor);
   
   _nodeTypeProvider = nodeTypeProvider;
   _processor = processor;
   _methodCallExpressionParser = new MethodCallExpressionParser (_nodeTypeProvider);
 }
    public void Parse_WithSubQuery_UsesNodeTypeRegistry ()
    {
      var emptyNodeTypeRegistry = new MethodInfoBasedNodeTypeRegistry ();
      emptyNodeTypeRegistry.Register (SelectExpressionNode.GetSupportedMethods(), typeof (SelectExpressionNode));
      var parser = new MethodCallExpressionParser (emptyNodeTypeRegistry);

      var expression = (MethodCallExpression) ExpressionHelper.MakeExpression<IQueryable<Cook>, IQueryable<int>> (
          q => q.Select (s => s.Assistants.Count ()));

      var result = parser.Parse ("t", _source, expression.Arguments.Skip (1), expression);

      Assert.That (result, Is.InstanceOf (typeof (SelectExpressionNode)));
      Assert.That (((SelectExpressionNode) result).Selector, Is.Not.TypeOf (typeof (SubQueryExpression)),
          "The given nodeTypeRegistry does not know any query methods, so no SubQueryExpression is generated.");
    }
Example #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ExpressionTreeParser"/> class with a custom <see cref="INodeTypeProvider"/> and
 /// <see cref="IExpressionTreeProcessor"/> implementation.
 /// </summary>
 /// <param name="nodeTypeProvider">The <see cref="INodeTypeProvider"/> to use when parsing <see cref="Expression"/> trees. Use
 /// <see cref="CreateDefaultNodeTypeProvider"/> to create an instance of <see cref="CompoundNodeTypeProvider"/> that already includes all
 /// default node types. (The <see cref="CompoundNodeTypeProvider"/> can be customized as needed by adding or removing
 /// <see cref="CompoundNodeTypeProvider.InnerProviders"/>).</param>
 /// <param name="processor">The <see cref="IExpressionTreeProcessor"/> to apply to <see cref="Expression"/> trees before parsing their nodes. Use
 /// <see cref="CreateDefaultProcessor"/> to create an instance of <see cref="CompoundExpressionTreeProcessor"/> that already includes
 /// the default steps. (The <see cref="CompoundExpressionTreeProcessor"/> can be customized as needed by adding or removing
 /// <see cref="CompoundExpressionTreeProcessor.InnerProcessors"/>).</param>
 public ExpressionTreeParser(INodeTypeProvider nodeTypeProvider, IExpressionTreeProcessor processor)
 {
     _nodeTypeProvider           = nodeTypeProvider;
     _processor                  = processor;
     _methodCallExpressionParser = new MethodCallExpressionParser(_nodeTypeProvider);
 }