示例#1
0
            public override Expression Visit(Expression expression)
            {
                if (expression is FromSqlExpression fromSql)
                {
                    if (!_visitedFromSqlExpressions.TryGetValue(fromSql, out var updatedFromSql))
                    {
                        switch (fromSql.Arguments)
                        {
                        case ParameterExpression parameterExpression:
                            var parameterValues = (object[])_parametersValues[parameterExpression.Name];

                            var subParameters = new List <IRelationalParameter>(parameterValues.Length);
                            for (var i = 0; i < parameterValues.Length; i++)
                            {
                                var parameterName = _parameterNameGenerator.GenerateNext();
                                if (parameterValues[i] is DbParameter dbParameter)
                                {
                                    if (string.IsNullOrEmpty(dbParameter.ParameterName))
                                    {
                                        dbParameter.ParameterName = parameterName;
                                    }
                                    else
                                    {
                                        parameterName = dbParameter.ParameterName;
                                    }

                                    subParameters.Add(new RawRelationalParameter(parameterName, dbParameter));
                                }
                                else
                                {
                                    subParameters.Add(
                                        new TypeMappedRelationalParameter(
                                            parameterName,
                                            parameterName,
                                            _SqlExpressionFactory.GetTypeMappingForValue(parameterValues[i]),
                                            parameterValues[i]?.GetType().IsNullableType()));
                                }
                            }

                            updatedFromSql = new FromSqlExpression(
                                fromSql.Sql,
                                Expression.Constant(
                                    new CompositeRelationalParameter(
                                        parameterExpression.Name,
                                        subParameters)),
                                fromSql.Alias);

                            _visitedFromSqlExpressions[fromSql] = updatedFromSql;
                            break;
                        }
                    }

                    return(updatedFromSql);
                }

                return(base.Visit(expression));
            }
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        public override Expression Visit(Expression expression)
        {
            if (expression is FromSqlExpression fromSql)
            {
                if (!_visitedFromSqlExpressions.TryGetValue(fromSql, out var updatedFromSql))
                {
                    switch (fromSql.Arguments)
                    {
                    case ParameterExpression parameterExpression:
                        var parameterValues = (object[])_parametersValues[parameterExpression.Name];

                        var subParameters = new List <IRelationalParameter>(parameterValues.Length);
                        // ReSharper disable once ForCanBeConvertedToForeach
                        for (var i = 0; i < parameterValues.Length; i++)
                        {
                            var parameterName = _parameterNameGenerator.GenerateNext();
                            if (parameterValues[i] is DbParameter dbParameter)
                            {
                                if (string.IsNullOrEmpty(dbParameter.ParameterName))
                                {
                                    dbParameter.ParameterName = parameterName;
                                }
                                else
                                {
                                    parameterName = dbParameter.ParameterName;
                                }

                                subParameters.Add(new RawRelationalParameter(parameterName, dbParameter));
                            }
                            else
                            {
                                subParameters.Add(
                                    new TypeMappedRelationalParameter(
                                        parameterName,
                                        parameterName,
                                        _typeMappingSource.GetMappingForValue(parameterValues[i]),
                                        parameterValues[i]?.GetType().IsNullableType()));
                            }
                        }

                        updatedFromSql = fromSql.Update(Expression.Constant(new CompositeRelationalParameter(parameterExpression.Name, subParameters)));

                        _visitedFromSqlExpressions[fromSql] = updatedFromSql;
                        break;

                    case ConstantExpression constantExpression:
                        var existingValues = (object[])constantExpression.Value;
                        var constantValues = new object[existingValues.Length];
                        for (var i = 0; i < existingValues.Length; i++)
                        {
                            var value = existingValues[i];
                            if (value is DbParameter dbParameter)
                            {
                                var parameterName = _parameterNameGenerator.GenerateNext();
                                if (string.IsNullOrEmpty(dbParameter.ParameterName))
                                {
                                    dbParameter.ParameterName = parameterName;
                                }
                                else
                                {
                                    parameterName = dbParameter.ParameterName;
                                }

                                constantValues[i] = new RawRelationalParameter(parameterName, dbParameter);
                            }
                            else
                            {
                                constantValues[i] = _sqlExpressionFactory.Constant(
                                    value, _typeMappingSource.GetMappingForValue(value));
                            }
                        }

                        updatedFromSql = fromSql.Update(Expression.Constant(constantValues, typeof(object[])));

                        _visitedFromSqlExpressions[fromSql] = updatedFromSql;
                        break;
                    }
                }

                return(updatedFromSql);
            }

            return(base.Visit(expression));
        }