提交 e6e2dc10 编写于 作者: R riberk 提交者: Shay Rojansky

Substring without length translation (#1046)

上级 4ae944b2
......@@ -41,7 +41,8 @@ public class NpgsqlStringMethodTranslator : IMethodCallTranslator
[NotNull] static readonly MethodInfo TrimBothWithNoParam = typeof(string).GetRuntimeMethod(nameof(string.Trim), Type.EmptyTypes);
[NotNull] static readonly MethodInfo TrimBothWithChars = typeof(string).GetRuntimeMethod(nameof(string.Trim), new[] { typeof(char[]) });
[NotNull] static readonly MethodInfo TrimBothWithSingleChar = typeof(string).GetRuntimeMethod(nameof(string.Trim), new[] { typeof(char) });
[NotNull] static readonly MethodInfo Substring = typeof(string).GetTypeInfo().GetDeclaredMethods(nameof(string.Substring)).Single(m => m.GetParameters().Length == 2);
[NotNull] static readonly MethodInfo Substring = typeof(string).GetTypeInfo().GetDeclaredMethods(nameof(string.Substring)).Single(m => m.GetParameters().Length == 1);
[NotNull] static readonly MethodInfo SubstringWithLength = typeof(string).GetTypeInfo().GetDeclaredMethods(nameof(string.Substring)).Single(m => m.GetParameters().Length == 2);
[NotNull] static readonly MethodInfo Replace = typeof(string).GetRuntimeMethod(nameof(string.Replace), new[] { typeof(string), typeof(string) });
[NotNull] static readonly MethodInfo PadLeft = typeof(string).GetRuntimeMethod(nameof(string.PadLeft), new[] { typeof(int) });
[NotNull] static readonly MethodInfo PadLeftWithChar = typeof(string).GetRuntimeMethod(nameof(string.PadLeft), new[] { typeof(int), typeof(char) });
......@@ -106,16 +107,15 @@ public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadO
instance.TypeMapping);
}
if (method == Substring)
if (method == Substring || method == SubstringWithLength)
{
var args =
method == Substring
? new[] { instance, GenerateOneBasedIndexExpression(arguments[0]) }
: new[] { instance, GenerateOneBasedIndexExpression(arguments[0]), arguments[1] };
return _sqlExpressionFactory.Function(
"SUBSTRING",
new[]
{
instance,
GenerateOneBasedIndexExpression(arguments[0]),
arguments[1]
},
args,
method.ReturnType,
instance.TypeMapping);
}
......
......@@ -172,6 +172,35 @@ public Task PadRight_char_with_parameter(bool isAsync)
#endregion
#region Substring
[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public Task Substring_without_length_with_Index_of(bool isAsync)
=> AssertQuery<Customer>(isAsync, cs => cs
.Where(x => x.Address == "Walserweg 21")
.Where(x => x.Address.Substring(x.Address.IndexOf("e")) == "erweg 21"), entryCount: 1);
[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public Task Substring_without_length_with_constant(bool isAsync)
=> AssertQuery<Customer>(isAsync, cs => cs
//Walserweg 21
.Where(x => x.Address.Substring(5) == "rweg 21"), entryCount: 1);
[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public Task Substring_without_length_with_closure(bool isAsync)
{
var startIndex = 5;
return AssertQuery<Customer>(isAsync, cs => cs
//Walserweg 21
.Where(x => x.Address.Substring(startIndex) == "rweg 21"), entryCount: 1);
}
#endregion
#region Array contains
// Note that this also takes care of array.Any(x => x == y)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册