Skip to content

Commit 4d5eb20

Browse files
committed
Added table hint for "INDEX(name)"
1 parent eb397c7 commit 4d5eb20

File tree

9 files changed

+1253
-11
lines changed

9 files changed

+1253
-11
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<Copyright>(c) $([System.DateTime]::Now.Year), Pawel Gerr. All rights reserved.</Copyright>
5-
<VersionPrefix>4.4.2</VersionPrefix>
5+
<VersionPrefix>4.5.0</VersionPrefix>
66
<Authors>Pawel Gerr</Authors>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>
88
<PackageProjectUrl>https://dev.azure.com/pawelgerr/Thinktecture.EntityFrameworkCore</PackageProjectUrl>
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1+
using Microsoft.EntityFrameworkCore.Storage;
2+
13
namespace Thinktecture.EntityFrameworkCore;
24

35
/// <summary>
46
/// Represents a table hint.
57
/// </summary>
68
public interface ITableHint
79
{
8-
}
10+
/// <summary>
11+
/// Returns a string representing the table hint.
12+
/// </summary>
13+
/// <param name="sqlGenerationHelper">SQL generation helper.</param>
14+
/// <returns>Table hint.</returns>
15+
string ToString(ISqlGenerationHelper sqlGenerationHelper);
16+
}

src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/Query/ThinktectureSqlServerQuerySqlGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private void VisitTableWithHints(TableWithHintsExpression tableWithHints)
5252
if (i != 0)
5353
Sql.Append(", ");
5454

55-
Sql.Append(tableWithHints.TableHints[i].ToString()!);
55+
Sql.Append(tableWithHints.TableHints[i].ToString(Dependencies.SqlGenerationHelper));
5656
}
5757

5858
Sql.Append(")");

src/Thinktecture.EntityFrameworkCore.SqlServer/EntityFrameworkCore/SqlServerTableHint.cs

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Microsoft.EntityFrameworkCore.Storage;
2+
13
namespace Thinktecture.EntityFrameworkCore;
24

35
/// <summary>
@@ -108,6 +110,14 @@ public static SqlServerTableHint Spatial_Window_Max_Cells(int value)
108110
return new($"SPATIAL_WINDOW_MAX_CELLS = {value}");
109111
}
110112

113+
/// <summary>
114+
/// INDEX(name)
115+
/// </summary>
116+
public static SqlServerTableHint Index(string name)
117+
{
118+
return new IndexTableHint(name);
119+
}
120+
111121
private readonly string _value;
112122

113123
private SqlServerTableHint(string value)
@@ -118,13 +128,7 @@ private SqlServerTableHint(string value)
118128
/// <inheritdoc />
119129
public override bool Equals(object? obj)
120130
{
121-
if (ReferenceEquals(null, obj))
122-
return false;
123-
if (ReferenceEquals(this, obj))
124-
return true;
125-
if (obj.GetType() != GetType())
126-
return false;
127-
return Equals((SqlServerTableHint)obj);
131+
return ReferenceEquals(this, obj) || (obj is SqlServerTableHint other && Equals(other));
128132
}
129133

130134
/// <inheritdoc />
@@ -149,4 +153,45 @@ public override string ToString()
149153
{
150154
return _value;
151155
}
156+
157+
/// <inheritdoc />
158+
public virtual string ToString(ISqlGenerationHelper sqlGenerationHelper)
159+
{
160+
return _value;
161+
}
162+
163+
private sealed class IndexTableHint : SqlServerTableHint, IEquatable<IndexTableHint>
164+
{
165+
private readonly string _name;
166+
167+
public IndexTableHint(string name)
168+
: base($"INDEX({name})")
169+
{
170+
_name = name;
171+
}
172+
173+
public override bool Equals(object? obj)
174+
{
175+
return ReferenceEquals(this, obj) || (obj is IndexTableHint other && Equals(other));
176+
}
177+
178+
public bool Equals(IndexTableHint? other)
179+
{
180+
if (ReferenceEquals(null, other))
181+
return false;
182+
if (ReferenceEquals(this, other))
183+
return true;
184+
return base.Equals(other) && _name == other._name;
185+
}
186+
187+
public override int GetHashCode()
188+
{
189+
return HashCode.Combine(base.GetHashCode(), _name);
190+
}
191+
192+
public override string ToString(ISqlGenerationHelper sqlGenerationHelper)
193+
{
194+
return $"INDEX({sqlGenerationHelper.DelimitIdentifier(_name)})";
195+
}
196+
}
152197
}

tests/Thinktecture.EntityFrameworkCore.SqlServer.Tests/Extensions/QueryableExtensionsTests/WithTableHints.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ public async Task Should_add_table_hints_to_table()
2626
result.Should().BeEmpty();
2727
}
2828

29+
[Fact]
30+
public async Task Should_escape_index_name()
31+
{
32+
var query = ActDbContext.TestEntities.WithTableHints(SqlServerTableHint.Index("IX_TestEntities_Id"));
33+
34+
query.ToQueryString().Should().Be("SELECT [t].[Id], [t].[ConvertibleClass], [t].[Count], [t].[Name], [t].[ParentId], [t].[PropertyWithBackingField], [t].[RequiredName], [t].[_privateField]" + Environment.NewLine +
35+
$"FROM {EscapedSchema}.[TestEntities] AS [t] WITH (INDEX([IX_TestEntities_Id]))");
36+
37+
var result = await query.ToListAsync();
38+
result.Should().BeEmpty();
39+
}
40+
2941
[Fact]
3042
public void Should_not_mess_up_table_hints()
3143
{

0 commit comments

Comments
 (0)