Ejemplo n.º 1
0
        protected override Expression VisitMethodCall(MethodCallExpression m)
        {
            switch (m.Method.Name)
            {
            case "Where":
                // ??? this.Visit(m.Arguments[0]);

                LambdaExpression lambda = (LambdaExpression)MojioTranslate.StripQuotes(m.Arguments[1]);
                this.Visit(lambda.Body);
                return(m);

            case "Equals":
                AddCriteria(m.Object, m.Arguments[0]);
                return(m);

            case "In":
                AddCriteria(m.Arguments[0], m.Arguments[1]);
                return(m);

            case "Contains":
                AddCriteria(m.Arguments[0], m.Object);
                return(m);
            }

            throw new NotSupportedException(string.Format("The method '{0}' is not supported", m.Method.Name));
        }
Ejemplo n.º 2
0
        public object Execute(Expression expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }

            var callExpression = expression as MethodCallExpression;

            if (callExpression != null)
            {
                Execute(callExpression.Arguments[0]);

                switch (callExpression.Method.Name)
                {
                case "Skip":
                    _offset = (int)((ConstantExpression)callExpression.Arguments[1]).Value;
                    break;

                case "Take":
                    _limit = (int)((ConstantExpression)callExpression.Arguments[1]).Value;
                    break;

                case "Where":
                    _criteria = new MojioCriteriaTranslator().Translate(callExpression, _criteria);
                    break;

                case "OrderByDescending":
                    _order = MojioTranslate.GetMemberName(callExpression.Arguments[1]);
                    _desc  = true;
                    break;

                case "OrderByAscending":
                case "OrderBy":
                    _order = MojioTranslate.GetMemberName(callExpression.Arguments[1]);
                    _desc  = false;
                    break;

                case "First":
                    _offset = 0;
                    _limit  = 1;
                    return(Fetch().First());

                case "FirstOrDefault":
                    _offset = 0;
                    _limit  = 1;
                    return(Fetch().FirstOrDefault());

                case "Count":
                    return(Count());

                case "Any":
                    return(Count() > 0);
                }
            }

            return(this);
        }
Ejemplo n.º 3
0
        private void AddCriteria(Expression left, Expression right, ExpressionType type = ExpressionType.Equal)
        {
            var memberExpression = MojioTranslate.GetMember(left);

            if (memberExpression == null)
            {
                throw new Exception("Cannot do this?");
            }

            var key = memberExpression.Member.Name;

            var constant = MojioTranslate.EvaluateSubtree(right);

            if (type == ExpressionType.Equal)
            {
                string value = MojioTranslate.GetValue(constant, memberExpression.Type);

                criteria.Add(key, value);
            }
            else if (constant.Value is DateTime)
            {
                AddDateRange(key, constant, type);
            }
        }