Skip to content

Commit bb2957c

Browse files
committed
Better StartsWith translation.
1 parent ba0f2d6 commit bb2957c

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/Query/ElementaryTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,19 @@ public async Task SelectableProcedureWithParam()
183183
Assert.DoesNotThrowAsync(() => query.LoadAsync());
184184
}
185185
}
186+
187+
[Test]
188+
public async Task SelectStartsWithConstant()
189+
{
190+
await using (var db = await GetDbContext<SelectContext>())
191+
{
192+
var query = db.Set<MonAttachment>()
193+
.Where(x => x.AttachmentName.StartsWith("Jiri"));
194+
Assert.DoesNotThrowAsync(() => query.LoadAsync());
195+
var sql = db.LastCommandText;
196+
StringAssert.Contains("'Jiri%'", sql);
197+
}
198+
}
186199
}
187200

188201
class SelectContext : FbTestDbContext

src/FirebirdSql.EntityFrameworkCore.Firebird/Query/ExpressionTranslators/Internal/FbStringStartsWithTranslator.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,14 @@ public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadO
4242
return null;
4343

4444
var patternExpression = _fbSqlExpressionFactory.ApplyDefaultTypeMapping(arguments[0]);
45+
var patternConstantExpression = patternExpression as SqlConstantExpression;
46+
var likePatternExpression = patternConstantExpression != null
47+
? (SqlExpression)_fbSqlExpressionFactory.Constant(((string)patternConstantExpression.Value) + "%")
48+
: (SqlExpression)_fbSqlExpressionFactory.Add(patternExpression, _fbSqlExpressionFactory.Constant("%"));
4549
var startsWithExpression = _fbSqlExpressionFactory.AndAlso(
4650
_fbSqlExpressionFactory.Like(
4751
instance,
48-
_fbSqlExpressionFactory.Add(patternExpression, _fbSqlExpressionFactory.Constant("%"))),
52+
likePatternExpression),
4953
_fbSqlExpressionFactory.Equal(
5054
_fbSqlExpressionFactory.ApplyDefaultTypeMapping(_fbSqlExpressionFactory.Function(
5155
"LEFT",
@@ -61,9 +65,9 @@ public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadO
6165
new[] { true, true },
6266
instance.Type)),
6367
patternExpression));
64-
return patternExpression is SqlConstantExpression sqlConstantExpression
65-
? (string)sqlConstantExpression.Value == string.Empty
66-
? (SqlExpression)_fbSqlExpressionFactory.Constant(true)
68+
return patternConstantExpression != null
69+
? (string)patternConstantExpression.Value == string.Empty
70+
? _fbSqlExpressionFactory.Constant(true)
6771
: startsWithExpression
6872
: _fbSqlExpressionFactory.OrElse(
6973
startsWithExpression,

0 commit comments

Comments
 (0)