System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateFunctionIntoLike C# (CSharp) Method

TranslateFunctionIntoLike() private method

Helper method for String.StartsWith, String.EndsWith and String.Contains object.Method(argument), where Method is one of String.StartsWith, String.EndsWith or String.Contains is translated into: 1) If argument is a constant or parameter and the provider supports escaping: object like ("%") + argument1 + ("%"), where argument1 is argument escaped by the provider and ("%") are appended on the begining/end depending on whether insertPercentAtStart/insertPercentAtEnd are specified 2) Otherwise: object.Method(argument) -> defaultTranslator
private TranslateFunctionIntoLike ( MethodCallExpression call, bool insertPercentAtStart, bool insertPercentAtEnd, Func defaultTranslator ) : DbExpression
call System.Linq.Expressions.MethodCallExpression
insertPercentAtStart bool Should '%' be inserted at the begining of the pattern
insertPercentAtEnd bool Should '%' be inserted at the end of the pattern
defaultTranslator Func The delegate that provides the default translation
return DbExpression
        private DbExpression TranslateFunctionIntoLike(
            MethodCallExpression call, bool insertPercentAtStart, bool insertPercentAtEnd,
            Func<ExpressionConverter, MethodCallExpression, DbExpression, DbExpression, DbExpression> defaultTranslator)
        {
            char escapeChar;
            var providerSupportsEscapingLikeArgument = ProviderManifest.SupportsEscapingLikeArgument(out escapeChar);
            var useLikeTranslation = false;
            var specifyEscape = true;

            var patternExpression = call.Arguments[0];
            var inputExpression = call.Object;

            var queryParameterExpression = patternExpression as QueryParameterExpression;
            if (providerSupportsEscapingLikeArgument && (queryParameterExpression != null))
            {
                useLikeTranslation = true;
                bool specifyEscapeDummy;
                patternExpression =
                    queryParameterExpression.EscapeParameterForLike(
                        input => PreparePattern(input, insertPercentAtStart, insertPercentAtEnd, out specifyEscapeDummy));
            }

            var translatedPatternExpression = TranslateExpression(patternExpression);
            var translatedInputExpression = TranslateExpression(inputExpression);

            if (providerSupportsEscapingLikeArgument && translatedPatternExpression.ExpressionKind == DbExpressionKind.Constant)
            {
                useLikeTranslation = true;
                var constantExpression = (DbConstantExpression)translatedPatternExpression;

                var preparedValue = PreparePattern(
                    (string)constantExpression.Value, insertPercentAtStart, insertPercentAtEnd, out specifyEscape);
                Debug.Assert(preparedValue != null, "The prepared value should not be null when the input is non-null");

                //Note: the result type needs to be taken from the original expression, as the user may have specified Unicode/Non-Unicode
                translatedPatternExpression = constantExpression.ResultType.Constant(preparedValue);
            }

            DbExpression result;
            if (useLikeTranslation)
            {
                if (specifyEscape)
                {
                    //DevDiv #326720: The constant expression for the escape character should not have unicode set by default
                    var escapeExpression =
                        EdmProviderManifest.Instance.GetCanonicalModelTypeUsage(PrimitiveTypeKind.String).Constant(
                            new String(new[] { escapeChar }));
                    result = translatedInputExpression.Like(translatedPatternExpression, escapeExpression);
                }
                else
                {
                    result = translatedInputExpression.Like(translatedPatternExpression);
                }
            }
            else
            {
                result = defaultTranslator(this, call, translatedPatternExpression, translatedInputExpression);
            }

            return result;
        }