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;
}