/// <summary> /// Tries to evaluate the current expression and add it as a projection /// </summary> private Expression AddProjection(Expression node, PocoColumn column = null) { var value = Expression.Lambda(node).Compile().DynamicInvoke(); if (column == null) { column = _pocoData.GetColumnByMemberName(_currentBindingName.Get()); if (column == null) { throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); } } _projections.Add(Tuple.Create(column, value, ExpressionType.Assign)); return(node); }
protected override Expression VisitMemberInit(MemberInitExpression node) { if (_parsePhase.Get() != ParsePhase.SelectBinding) { throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); } // Visit new instance creation (constructor and parameters) VisitNew(node.NewExpression); foreach (var binding in node.Bindings) { if (!(binding is MemberAssignment)) { continue; } using (_currentBindingName.Set(binding.Member.Name)) { Visit((binding as MemberAssignment).Expression); } } return(node); }
private bool EvaluateMethod(string name, MethodCallExpression node) { var clause = _currentCondition.Get().Item1; var parameters = _currentCondition.Get().Item2; switch (name) { case "Contains": { Expression what; Expression inp; if (node.Object == null) { what = node.Arguments[1]; inp = node.Arguments[0]; } else { what = node.Arguments[0]; inp = node.Object; } Visit(what); var values = (IEnumerable)Expression.Lambda(inp).Compile().DynamicInvoke(); var placeHolders = new StringBuilder(); foreach (var v in values) { placeHolders.Append(placeHolders.Length == 0 ? "?" : ", ?"); parameters.Add(v); } clause .Append(" IN (") .Append(placeHolders) .Append(")"); return(true); } case "StartsWith": Visit(node.Object); var startsWithArgument = node.Arguments[0]; var startString = (string)Expression.Lambda(startsWithArgument).Compile().DynamicInvoke(); var endString = startString + _utf8MaxValue; parameters.Add(startString); parameters.Add(endString); clause .Append(" ") .Append(CqlTags[ExpressionType.GreaterThanOrEqual]) .Append(" ? ") .Append(CqlTags[ExpressionType.And]) .Append(" "); Visit(node.Object); clause .Append(" ") .Append(CqlTags[ExpressionType.LessThan]) .Append(" ?"); return(true); case "CompareTo": Visit(node.Object); clause .Append(" ") .Append(_binaryExpressionTag.Get()) .Append(" "); Visit(node.Arguments[0]); return(true); case "Equals": Visit(node.Object); clause.Append(" = "); Visit(node.Arguments[0]); return(true); case "CqlToken": case "Token": clause.Append("token("); var tokenArgs = node.Arguments; for (var i = 0; i < tokenArgs.Count; i++) { var arg = tokenArgs[i]; if (i > 0) { clause.Append(", "); } Visit(arg); } clause.Append(")"); return(true); case "MaxTimeUuid": case "MinTimeUuid": clause.Append(name.ToLowerInvariant()).Append("("); Visit(node.Arguments[0]); clause.Append(")"); return(true); } return(false); }
private Expression EvaluateConditionFunction(MethodCallExpression node) { var methodName = node.Method.Name; if (node.Method.DeclaringType != null) { if (node.Method.DeclaringType == typeof(CqlToken)) { methodName = "CqlToken"; } } if (EvaluateMethod(methodName, node)) { //It was evaluated as one of the methods return(node); } //Try to invoke to obtain the value var val = Expression.Lambda(node).Compile().DynamicInvoke(); _currentCondition.Get().Item2.Add(val); _currentCondition.Get().Item1.Append("?"); return(node); }
private bool EvaluateMethod(string name, MethodCallExpression node) { var clause = _currentCondition.Get().Item1; var parameters = _currentCondition.Get().Item2; switch (name) { case "Contains": { EvaluateContainsMethod(node, clause, parameters); return(true); } case "StartsWith": Visit(node.Object); var startsWithArgument = node.Arguments[0]; var startString = (string)Expression.Lambda(startsWithArgument).Compile().DynamicInvoke(); var endString = startString + _utf8MaxValue; parameters.Add(startString); parameters.Add(endString); clause .Append(" ") .Append(CqlTags[ExpressionType.GreaterThanOrEqual]) .Append(" ? ") .Append(CqlTags[ExpressionType.And]) .Append(" "); Visit(node.Object); clause .Append(" ") .Append(CqlTags[ExpressionType.LessThan]) .Append(" ?"); return(true); case "CompareTo": Visit(node.Object); clause .Append(" ") .Append(_binaryExpressionTag.Get()) .Append(" "); Visit(node.Arguments[0]); return(true); case "Equals": Visit(node.Object); clause.Append(" = "); Visit(node.Arguments[0]); return(true); case "CqlToken": case "Token": clause.Append("token("); var tokenArgs = node.Arguments; for (var i = 0; i < tokenArgs.Count; i++) { var arg = tokenArgs[i]; if (i > 0) { clause.Append(", "); } Visit(arg); } clause.Append(")"); return(true); case "MaxTimeUuid": case "MinTimeUuid": clause.Append(name.ToLowerInvariant()).Append("("); Visit(node.Arguments[0]); clause.Append(")"); return(true); } return(false); }