コード例 #1
0
 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);
 }
コード例 #2
0
        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());
        }
コード例 #3
0
        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());
        }