private Expression FillCondition(MemberExpression node, StringBuilder clause, List <object> parameters) { if (node.Expression == null || node.Expression.NodeType == ExpressionType.MemberAccess) { var val = GetClosureValue(node); parameters.Add(val); clause.Append("?"); return(node); } if (node.Expression.NodeType == ExpressionType.Parameter) { var columnName = _pocoData.GetColumnName(node.Member); if (columnName == null) { throw new InvalidOperationException( "Trying to order by a field or property that is ignored or not part of the mapping definition."); } clause.Append(Escape(columnName)); return(node); } if (node.Expression.NodeType == ExpressionType.Constant) { var val = GetClosureValue(node); if (val is CqlToken) { clause.Append("token("); var tokenValues = (val as CqlToken).Values; var tokenPlaceholders = new StringBuilder(tokenValues.Length * 3); foreach (var pk in tokenValues) { parameters.Add(pk); tokenPlaceholders.Append(tokenPlaceholders.Length == 0 ? "?" : ", ?"); } clause.Append(")"); } else { parameters.Add(val); clause.Append("?"); } return(node); } return(node); }
private Expression FillOrderBy(MemberExpression node) { var columnName = _pocoData.GetColumnName(node.Member); if (columnName == null) { throw new InvalidOperationException( "Trying to order by a field or property that is ignored or not part of the mapping definition."); } _orderBy.Add(Tuple.Create(columnName, _parsePhase.Get() == ParsePhase.OrderBy)); if ((node.Expression is ConstantExpression)) { return(node); } if (node.Expression.NodeType == ExpressionType.Parameter) { return(node); } throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); }
protected override Expression VisitMember(MemberExpression node) { switch (_parsePhase.Get()) { case ParsePhase.Condition: { var clause = _currentCondition.Get().Item1; var parameters = _currentCondition.Get().Item2; if (node.Expression == null) { var val = Expression.Lambda(node).Compile().DynamicInvoke(); parameters.Add(val); clause.Append("?"); return(node); } if (node.Expression.NodeType == ExpressionType.Parameter) { var columnName = _pocoData.GetColumnName(node.Member); if (columnName == null) { throw new InvalidOperationException( "Trying to order by a field or property that is ignored or not part of the mapping definition."); } clause.Append(Escape(columnName)); return(node); } if (node.Expression.NodeType == ExpressionType.Constant) { var val = Expression.Lambda(node).Compile().DynamicInvoke(); if (val is CqlToken) { clause.Append("token("); var tokenPlaceholders = new StringBuilder(); foreach (var pk in (val as CqlToken).Values) { parameters.Add(pk); tokenPlaceholders.Append(tokenPlaceholders.Length == 0 ? "?" : ", ?"); } clause.Append(")"); } else { parameters.Add(val); clause.Append("?"); } return(node); } if (node.Expression.NodeType == ExpressionType.MemberAccess) { var val = Expression.Lambda(node).Compile().DynamicInvoke(); parameters.Add(val); clause.Append("?"); return(node); } break; } case ParsePhase.SelectBinding: { PocoColumn column; if (node.Expression == null || node.Expression.NodeType != ExpressionType.Parameter) { column = _pocoData.GetColumnByMemberName(_currentBindingName.Get()); AddProjection(node, column); _selectFields.Add(column.ColumnName); return(node); } column = _pocoData.GetColumnByMemberName(node.Member.Name); _projections.Add(Tuple.Create(column, (object)column.ColumnName, ExpressionType.Assign)); _selectFields.Add(column.ColumnName); return(node); } case ParsePhase.OrderByDescending: case ParsePhase.OrderBy: { var columnName = _pocoData.GetColumnName(node.Member); if (columnName == null) { throw new InvalidOperationException( "Trying to order by a field or property that is ignored or not part of the mapping definition."); } _orderBy.Add(Tuple.Create(columnName, _parsePhase.Get() == ParsePhase.OrderBy)); if ((node.Expression is ConstantExpression)) { return(node); } if (node.Expression.NodeType == ExpressionType.Parameter) { return(node); } break; } } throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); }