コード例 #1
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp = functionExpressionNode as MethodCallExpression;

            if (exp.Object != null && exp.Object.Type == typeof(string))
            {
                var expStrParser = new SqlDbQueryFunctionStringContainsNode()
                {
                    ModelStrategy = ModelStrategy
                };
                var expStr = expStrParser.Parse(parameterDictionary, functionExpressionNode);
                expressionBuilder.Append(expStr);
            }
            else
            {
                var collectionValueParser = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments[0], ModelStrategy);
                var fieldParser           = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments[1], ModelStrategy);
                var field           = fieldParser.Parse(parameterDictionary, exp.Arguments[1]);
                var collectionValue = collectionValueParser.Parse(parameterDictionary, exp.Arguments[0]);

                expressionBuilder.Append(field);
                expressionBuilder.Append(" IN ");
                expressionBuilder.Append(collectionValue);
                expressionBuilder.Append(" ");
            }

            return(expressionBuilder.ToString());
        }
コード例 #2
0
        private string ParseSelectorToColumn(DbQueryColumnClause <TModel> expression)
        {
            var exp = expression.ColumExpression;

            // check expression type is "New Expression" or "Parameter Expression"
            if (exp.Body is NewExpression)
            {
                var newExpNode = new SqlDbQueryNewExpressionRenderColumnsNode();
                newExpNode.ModelStrategy = _modelStrategy;
                return(newExpNode.Parse(_parameterDictionary, exp.Body));
            }

            if (exp.Body is UnaryExpression)
            {
                var paramNode = SqlDbQueryExpressionFactory.GetNodeParser(exp.Body, _modelStrategy);
                return(paramNode.Parse(_parameterDictionary, exp.Body));
            }

            if (exp.Body is ParameterExpression)
            {
                var paramNode = new SqlDbQueryParameterExpressionRenderColumnsNode();
                paramNode.ModelStrategy = _modelStrategy;
                return(paramNode.Parse(_parameterDictionary, exp.Body));
            }

            throw new NotSupportedException("Not supported expression type.");
        }
コード例 #3
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp = functionExpressionNode as MethodCallExpression;
            var expParser = SqlDbQueryExpressionFactory.GetNodeParser(exp.Object, ModelStrategy);
            var argExp = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments.First(), ModelStrategy);
            int startIndex = 0, length = 0;

            var arguments = exp.Arguments;

            if (arguments.Count() == 1)
            {
                length = Convert.ToInt32(argExp.Parse(parameterDictionary, exp.Arguments.ElementAt(0)));
            }
            else
            {
                startIndex = Convert.ToInt32(argExp.Parse(parameterDictionary, exp.Arguments.ElementAt(0)));
                length     = Convert.ToInt32(argExp.Parse(parameterDictionary, exp.Arguments.ElementAt(1)));
            }

            startIndex++; // fix different of T-SQL (start from 1) and CLR (start from 0).

            expressionBuilder.Append("SUBSTRING(");
            expressionBuilder.Append(expParser.Parse(parameterDictionary, exp.Object));
            expressionBuilder.Append(string.Format(", {0}, {1}", startIndex, length));
            expressionBuilder.Append(")");

            return(expressionBuilder.ToString());
        }
コード例 #4
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp       = functionExpressionNode as MethodCallExpression;
            var expParser = SqlDbQueryExpressionFactory.GetNodeParser(exp, ModelStrategy);
            var argExp    = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments.First(), ModelStrategy);

            var  arguments = exp.Arguments;
            bool firstarg  = true;

            expressionBuilder.Append("CONCAT(");

            foreach (var argument in arguments)
            {
                if (!firstarg)
                {
                    expressionBuilder.Append(", ");
                }

                expressionBuilder.Append(argExp.Parse(parameterDictionary, argument));
            }

            expressionBuilder.Append(")");

            return(expressionBuilder.ToString());
        }
コード例 #5
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp = functionExpressionNode as MethodCallExpression;

            if (exp.Object == null)
            {
                var expParser = new SqlQueryFunctionCollectionContainsNode()
                {
                    ModelStrategy = ModelStrategy
                };
                var expStr = expParser.Parse(parameterDictionary, functionExpressionNode);
                expressionBuilder.Append(expStr);
            }
            else
            {
                var expParser     = SqlDbQueryExpressionFactory.GetNodeParser(exp, ModelStrategy);
                var argExp        = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments.First(), ModelStrategy);
                var callSourceExp = SqlDbQueryExpressionFactory.GetNodeParser(exp.Object, ModelStrategy);
                var argument      = argExp.Parse(parameterDictionary, exp.Arguments.First());

                // handling parameter, remove first and last character.
                argument = argument.Substring(1);
                argument = argument.Substring(0, argument.Length - 1);

                expressionBuilder.Append(callSourceExp.Parse(parameterDictionary, exp.Object));
                expressionBuilder.Append(" LIKE '%");
                expressionBuilder.Append(argument);
                expressionBuilder.Append("%' ");
            }

            return(expressionBuilder.ToString());
        }
コード例 #6
0
 private string ParseSelectorToColumns <TModel>(Expression <Func <TModel, object> > selector)
 {
     // check expression type is "New Expression" or "Parameter Expression"
     if (selector.Body is NewExpression)
     {
         var newExpNode = new SqlDbQueryNewExpressionRenderColumnsNode();
         newExpNode.ModelStrategy = _modelStrategy;
         return(newExpNode.Parse(_parameterDictionary, selector.Body));
     }
     else if (selector.Body is UnaryExpression)
     {
         var paramNode = SqlDbQueryExpressionFactory.GetNodeParser(selector.Body, _modelStrategy);
         return(paramNode.Parse(_parameterDictionary, selector.Body));
     }
     else if (selector.Body is ParameterExpression)
     {
         var paramNode = new SqlDbQueryParameterExpressionRenderColumnsNode();
         paramNode.ModelStrategy = _modelStrategy;
         return(paramNode.Parse(_parameterDictionary, selector.Body));
     }
     else
     {
         throw new DbEnvironmentException(
                   "ERROR_EXPRESSION_NOT_SUPPORTED");
     }
 }
コード例 #7
0
        private string ParseGroupByColumns(IEnumerable <DbQueryGroupByClause <TModel> > groupBySelectors)
        {
            if (groupBySelectors == null || !groupBySelectors.Any())
            {
                return(string.Empty);
            }

            var groupByColumnsBuilder = new StringBuilder();

            foreach (var groupBySelector in groupBySelectors)
            {
                var groupByClause = groupBySelector.Clause;

                // check expression type is "New Expression" or "Parameter Expression"
                if (groupByClause.Body is NewExpression)
                {
                    throw new NotSupportedException("ERROR_GROUP_BY_NOT_SUPPORT_NEW_EXPRESSION");
                }
                else if (groupByClause.Body is UnaryExpression)
                {
                    var paramNode = SqlDbQueryExpressionFactory.GetNodeParser(groupByClause.Body, _modelStrategy);

                    var name = paramNode.Parse(_parameterDictionary, groupByClause.Body);

                    if (groupByColumnsBuilder.Length > 0)
                    {
                        groupByColumnsBuilder.Append(", " + name);
                    }
                    else
                    {
                        groupByColumnsBuilder.Append(name);
                    }
                }
                else if (groupByClause.Body is ParameterExpression)
                {
                    var paramNode = new SqlDbQueryParameterExpressionRenderColumnsNode();
                    paramNode.ModelStrategy = _modelStrategy;
                    var name = paramNode.Parse(_parameterDictionary, groupByClause.Body);

                    if (groupByColumnsBuilder.Length > 0)
                    {
                        groupByColumnsBuilder.Append(", " + name);
                    }
                    else
                    {
                        groupByColumnsBuilder.Append(name);
                    }
                }
                else
                {
                    throw new DbEnvironmentException(
                              "ERROR_EXPRESSION_NOT_SUPPORTED");
                }
            }

            return(groupByColumnsBuilder.ToString());
        }
コード例 #8
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var expParser         = SqlDbQueryExpressionFactory.GetNodeParser(functionExpressionNode, ModelStrategy);

            expressionBuilder.Append("DATEPART(SECOND, ");
            expressionBuilder.Append(expParser.Parse(parameterDictionary, functionExpressionNode));
            expressionBuilder.Append(")");

            return(expressionBuilder.ToString());
        }
コード例 #9
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp       = functionExpressionNode as MethodCallExpression;
            var expParser = SqlDbQueryExpressionFactory.GetNodeParser(exp.Object, ModelStrategy);

            expressionBuilder.Append("LTRIM(RTRIM(");
            expressionBuilder.Append(expParser.Parse(parameterDictionary, exp.Object));
            expressionBuilder.Append("))");

            return(expressionBuilder.ToString());
        }
コード例 #10
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp       = functionExpressionNode as MethodCallExpression;
            var expParser = SqlDbQueryExpressionFactory.GetNodeParser(exp, ModelStrategy);
            var argExp    = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments.First(), ModelStrategy);

            expressionBuilder.Append("(");
            expressionBuilder.Append(argExp.Parse(parameterDictionary, exp.Arguments.First()));
            expressionBuilder.Append(" IS NULL) OR (LEN(");
            expressionBuilder.Append(argExp.Parse(parameterDictionary, exp.Arguments.First()));
            expressionBuilder.Append(") = 0)");

            return(expressionBuilder.ToString());
        }
コード例 #11
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp           = (MethodCallExpression)functionExpressionNode;
            var expParser     = SqlDbQueryExpressionFactory.GetNodeParser(exp, ModelStrategy);
            var argExp        = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments.First(), ModelStrategy);
            var callSourceExp = SqlDbQueryExpressionFactory.GetNodeParser(exp.Object, ModelStrategy);
            var argument      = argExp.Parse(parameterDictionary, exp.Arguments.First());

            expressionBuilder.Append("CHARINDEX(");
            expressionBuilder.Append(argExp.Parse(parameterDictionary, exp.Arguments.First()));
            expressionBuilder.Append(", ");
            expressionBuilder.Append(callSourceExp.Parse(parameterDictionary, exp.Object));
            expressionBuilder.Append(")");

            return(expressionBuilder.ToString());
        }
コード例 #12
0
        public override string Parse(IDictionary <string, object> parameterDictionary, Expression functionExpressionNode)
        {
            var expressionBuilder = new StringBuilder();
            var exp = functionExpressionNode as MethodCallExpression;

            if (exp.Object == null)
            {
                throw new NotSupportedException();
            }
            else
            {
                var expParser     = SqlDbQueryExpressionFactory.GetNodeParser(exp, ModelStrategy);
                var argExp        = SqlDbQueryExpressionFactory.GetNodeParser(exp.Arguments.First(), ModelStrategy);
                var callSourceExp = SqlDbQueryExpressionFactory.GetNodeParser(exp.Object, ModelStrategy);
                var argument      = argExp.Parse(parameterDictionary, exp.Arguments.First());

                expressionBuilder.Append(callSourceExp.Parse(parameterDictionary, exp.Object));
                expressionBuilder.Append(" LIKE '%");
                expressionBuilder.Append(argument.Substring(1));
                expressionBuilder.Append(" ");
            }

            return(expressionBuilder.ToString());
        }