in EFCore/src/Query/Internal/MySQLStringMethodTranslator.cs [94:233]
public virtual SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList<SqlExpression> arguments, IDiagnosticsLogger<DbLoggerCategory.Query> logger)
{
if (_indexOfMethodInfo.Equals(method))
{
return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory)
.MakeIndexOfExpression(instance, arguments[0]);
}
if (_replaceMethodInfo.Equals(method))
{
var stringTypeMapping = ExpressionExtensions.InferTypeMapping(instance!, arguments[0], arguments[1]);
return _sqlExpressionFactory.NullableFunction(
"REPLACE",
new[]
{
_sqlExpressionFactory.ApplyTypeMapping(instance!, stringTypeMapping),
_sqlExpressionFactory.ApplyTypeMapping(arguments[0], stringTypeMapping),
_sqlExpressionFactory.ApplyTypeMapping(arguments[1], stringTypeMapping)
},
method.ReturnType,
stringTypeMapping);
}
if (_toLowerMethodInfo.Equals(method)
|| _toUpperMethodInfo.Equals(method))
{
return _sqlExpressionFactory.NullableFunction(
_toLowerMethodInfo.Equals(method) ? "LOWER" : "UPPER",
new[] { instance! },
method.ReturnType,
instance!.TypeMapping);
}
if (_substringMethodInfo.Equals(method))
{
return _sqlExpressionFactory.NullableFunction(
"SUBSTRING",
new[]
{
instance!,
_sqlExpressionFactory.Add(
arguments[0],
_sqlExpressionFactory.Constant(1)),
arguments[1]
},
method.ReturnType,
instance!.TypeMapping);
}
if (_isNullOrWhiteSpaceMethodInfo.Equals(method))
{
return _sqlExpressionFactory.OrElse(
_sqlExpressionFactory.IsNull(arguments[0]),
_sqlExpressionFactory.Equal(
ProcessTrimMethod(arguments[0], null, null),
_sqlExpressionFactory.Constant(string.Empty)));
}
if (_trimStartMethodInfoWithoutArgs?.Equals(method) == true
|| _trimStartMethodInfoWithCharArg?.Equals(method) == true
|| _trimStartMethodInfoWithCharArrayArg.Equals(method))
{
return ProcessTrimMethod(instance!, arguments.Count > 0 ? arguments[0] : null, "LEADING");
}
if (_trimEndMethodInfoWithoutArgs?.Equals(method) == true
|| _trimEndMethodInfoWithCharArg?.Equals(method) == true
|| _trimEndMethodInfoWithCharArrayArg.Equals(method))
{
return ProcessTrimMethod(instance!, arguments.Count > 0 ? arguments[0] : null, "TRAILING");
}
if (_trimMethodInfoWithoutArgs?.Equals(method) == true
|| _trimMethodInfoWithCharArg?.Equals(method) == true
|| _trimMethodInfoWithCharArrayArg.Equals(method))
{
return ProcessTrimMethod(instance!, arguments.Count > 0 ? arguments[0] : null, null);
}
if (_containsMethodInfo.Equals(method))
{
return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory)
.MakeContainsExpression(instance!, arguments[0]);
}
if (_startsWithMethodInfo.Equals(method))
{
return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory)
.MakeStartsWithExpression(instance!, arguments[0], _sqlExpressionFactory.Constant(StringComparison.CurrentCulture));
}
if (_endsWithMethodInfo.Equals(method))
{
return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory)
.MakeEndsWithExpression(instance!, arguments[0], _sqlExpressionFactory.Constant(StringComparison.CurrentCulture));
}
if (_padLeftWithOneArg.Equals(method))
{
return TranslatePadLeftRight(
true,
instance!,
arguments[0],
_sqlExpressionFactory.Constant(" "),
method.ReturnType);
}
if (_padRightWithOneArg.Equals(method))
{
return TranslatePadLeftRight(
false,
instance!,
arguments[0],
_sqlExpressionFactory.Constant(" "),
method.ReturnType);
}
if (_padLeftWithTwoArgs.Equals(method))
{
return TranslatePadLeftRight(
true,
instance!,
arguments[0],
arguments[1],
method.ReturnType);
}
if (_padRightWithTwoArgs.Equals(method))
{
return TranslatePadLeftRight(
false,
instance!,
arguments[0],
arguments[1],
method.ReturnType);
}
return null;
}