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)); }
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); }
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); } }