protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            if (node.Arguments.Count != 2)
            {
                throw Utils.NotSupportedExpression(node);
            }

            var association = AddNestedExpandAssociationAndGetDeepestChild(node.Arguments[0]);

            switch (node.Method.Name)
            {
            case "Select":
            {
                association.ExpandAssociations.AddRange(ExtractNestedExpandAssociations(node.Arguments[1]));

                return(node);
            }

            case "OrderBy":
            case "ThenBy":
            {
                if ((node.Arguments[0] as MethodCallExpression)?.Method.Name == "Select")
                {
                    throw Utils.NotSupportedExpression(node);
                }

                association.OrderByColumns
                .AddRange(node.Arguments[1]
                          .ExtractColumnNames(_typeCache).Select(c => new ODataOrderByColumn(c, false)));

                return(node);
            }

            case "OrderByDescending":
            case "ThenByDescending":
            {
                if ((node.Arguments[0] as MethodCallExpression)?.Method.Name == "Select")
                {
                    throw Utils.NotSupportedExpression(node);
                }

                association.OrderByColumns
                .AddRange(node.Arguments[1]
                          .ExtractColumnNames(_typeCache).Select(c => new ODataOrderByColumn(c, true)));

                return(node);
            }

            case "Where":
            {
                var filterExpression =
                    ODataExpression.FromLinqExpression((node.Arguments[1] as LambdaExpression)?.Body);
                if (ReferenceEquals(association.FilterExpression, null))
                {
                    association.FilterExpression = filterExpression;
                }
                else
                {
                    association.FilterExpression = association.FilterExpression && filterExpression;
                }

                return(node);
            }

            default:
                throw Utils.NotSupportedExpression(node);
            }
        }
Esempio n. 2
0
 public FT Filter(Expression <Func <T, bool> > expression)
 {
     this.Command.Filter(ODataExpression.FromLinqExpression(expression.Body));
     return(this as FT);
 }
Esempio n. 3
0
 public FT QueryOptions <U>(Expression <Func <U, bool> > expression)
 {
     this.Command.QueryOptions(ODataExpression.FromLinqExpression(expression.Body));
     return(this as FT);
 }
Esempio n. 4
0
 public IBoundClient <T> Filter(Expression <Func <T, bool> > expression)
 {
     this.Command.Filter(ODataExpression.FromLinqExpression(expression.Body));
     return(this);
 }