Skip to content

Commit f4a8d27

Browse files
authored
Merge pull request #41 from yv989c/feature/ef8-support
Feature/ef8 support
2 parents 1e3d4b1 + f94f207 commit f4a8d27

File tree

15 files changed

+201
-20
lines changed

15 files changed

+201
-20
lines changed

BlazarTech.QueryableValues.sln

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryableValues.SqlServer.T
3232
EndProject
3333
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryableValues.SqlServer.Benchmarks", "benchmarks\QueryableValues.SqlServer.Benchmarks\QueryableValues.SqlServer.Benchmarks.csproj", "{99FE31A0-BC7E-412C-82E2-DA19E8B68613}"
3434
EndProject
35+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryableValues.SqlServer.EFCore8", "src\QueryableValues.SqlServer.EFCore8\QueryableValues.SqlServer.EFCore8.csproj", "{03A17C43-5E66-4A8F-B650-7F611E73BD0B}"
36+
EndProject
37+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryableValues.SqlServer.Tests.EFCore8", "tests\QueryableValues.SqlServer.Tests.EFCore8\QueryableValues.SqlServer.Tests.EFCore8.csproj", "{9387545B-CABC-4C63-A163-4F64C65A370F}"
38+
EndProject
3539
Global
3640
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3741
Debug|Any CPU = Debug|Any CPU
@@ -118,6 +122,22 @@ Global
118122
{99FE31A0-BC7E-412C-82E2-DA19E8B68613}.Test_All|Any CPU.ActiveCfg = Release|Any CPU
119123
{99FE31A0-BC7E-412C-82E2-DA19E8B68613}.Test_All|Any CPU.Build.0 = Release|Any CPU
120124
{99FE31A0-BC7E-412C-82E2-DA19E8B68613}.Test|Any CPU.ActiveCfg = Release|Any CPU
125+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
126+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
127+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
128+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Release|Any CPU.Build.0 = Release|Any CPU
129+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Test_All|Any CPU.ActiveCfg = Test|Any CPU
130+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Test_All|Any CPU.Build.0 = Test|Any CPU
131+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Test|Any CPU.ActiveCfg = Test|Any CPU
132+
{03A17C43-5E66-4A8F-B650-7F611E73BD0B}.Test|Any CPU.Build.0 = Test|Any CPU
133+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
134+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Debug|Any CPU.Build.0 = Debug|Any CPU
135+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Release|Any CPU.ActiveCfg = Release|Any CPU
136+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Release|Any CPU.Build.0 = Release|Any CPU
137+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Test_All|Any CPU.ActiveCfg = Test_All|Any CPU
138+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Test_All|Any CPU.Build.0 = Test_All|Any CPU
139+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Test|Any CPU.ActiveCfg = Test|Any CPU
140+
{9387545B-CABC-4C63-A163-4F64C65A370F}.Test|Any CPU.Build.0 = Test|Any CPU
121141
EndGlobalSection
122142
GlobalSection(SolutionProperties) = preSolution
123143
HideSolutionNode = FALSE

Version.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<Project>
22
<PropertyGroup>
3-
<VersionEFCore3>3.9.0</VersionEFCore3>
4-
<VersionEFCore5>5.9.0</VersionEFCore5>
5-
<VersionEFCore6>6.9.0</VersionEFCore6>
6-
<VersionEFCore7>7.4.0</VersionEFCore7>
3+
<VersionEFCore3>3.9.1</VersionEFCore3>
4+
<VersionEFCore5>5.9.1</VersionEFCore5>
5+
<VersionEFCore6>6.9.1</VersionEFCore6>
6+
<VersionEFCore7>7.4.1</VersionEFCore7>
7+
<VersionEFCore8>8.0.0</VersionEFCore8>
78
</PropertyGroup>
89
</Project>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<Import Project="../SharedProjectProperties.xml" />
3+
<Import Project="../../Version.xml" />
4+
5+
<PropertyGroup>
6+
<VersionPrefix>$(VersionEFCore8)</VersionPrefix>
7+
<TargetFramework>net8.0</TargetFramework>
8+
<Configurations>Debug;Release;Test</Configurations>
9+
<DefineConstants>$(DefineConstants);EFCORE;EFCORE8</DefineConstants>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="[8.0,)" />
14+
</ItemGroup>
15+
</Project>

src/QueryableValues.SqlServer/QueryableValuesEntity.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24

35
namespace BlazarTech.QueryableValues
46
{
57
internal class QueryableValuesEntity
68
{
9+
private static readonly IReadOnlyList<string> DataPropertyNames;
10+
711
public const string IndexPropertyName = nameof(X);
812

13+
static QueryableValuesEntity()
14+
{
15+
DataPropertyNames = GetDataPropertyNames();
16+
}
17+
918
public int X { get; set; }
1019

1120
public int? I { get; set; }
@@ -150,5 +159,38 @@ internal class QueryableValuesEntity
150159
public char? C7 { get; set; }
151160
public char? C8 { get; set; }
152161
public char? C9 { get; set; }
162+
163+
private static List<string> GetDataPropertyNames()
164+
{
165+
var properties = typeof(QueryableValuesEntity).GetProperties();
166+
var result = new List<string>(properties.Length);
167+
168+
foreach (var property in properties)
169+
{
170+
if (property.Name is IndexPropertyName)
171+
{
172+
continue;
173+
}
174+
175+
result.Add(property.Name);
176+
}
177+
178+
return result;
179+
}
180+
181+
internal static IEnumerable<string> GetUnmappedPropertyNames(IReadOnlyList<EntityPropertyMapping> mappings)
182+
{
183+
var targetProperties = new HashSet<string>(mappings.Select(i => i.Target.Name));
184+
185+
foreach (var propertyName in DataPropertyNames)
186+
{
187+
if (targetProperties.Contains(propertyName))
188+
{
189+
continue;
190+
}
191+
192+
yield return propertyName;
193+
}
194+
}
153195
}
154196
}

src/QueryableValues.SqlServer/SqlServer/JsonQueryableFactory.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,21 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
3838

3939
sb.Append(" [").Append(QueryableValuesEntity.IndexPropertyName).Append(']');
4040

41-
for (var i = 0; i < mappings.Count; i++)
41+
foreach (var mapping in mappings)
4242
{
43-
sb.Append(", [").Append(mappings[i].Target.Name).Append(']');
43+
sb.Append(", [").Append(mapping.Target.Name).Append(']');
44+
}
45+
46+
foreach (var unmappedPropertyName in QueryableValuesEntity.GetUnmappedPropertyNames(mappings))
47+
{
48+
sb.Append(", NULL[").Append(unmappedPropertyName).Append(']');
4449
}
4550

4651
sb.AppendLine();
4752
sb.Append("FROM OPENJSON({0}) WITH ([").Append(QueryableValuesEntity.IndexPropertyName).Append("] int");
4853

49-
for (var i = 0; i < mappings.Count; i++)
54+
foreach (var mapping in mappings)
5055
{
51-
var mapping = mappings[i];
5256
var propertyOptions = entityOptions.GetPropertyOptions(mapping.Source);
5357

5458
sb.Append(", ");

src/QueryableValues.SqlServer/SqlServer/XmlQueryableFactory.cs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,12 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
4141
sb
4242
.Append("\tI.value('@")
4343
.Append(QueryableValuesEntity.IndexPropertyName)
44-
.Append(" cast as xs:integer?', 'int') AS [")
44+
.Append(" cast as xs:integer?', 'int') [")
4545
.Append(QueryableValuesEntity.IndexPropertyName)
4646
.Append(']');
4747

48-
for (int i = 0; i < mappings.Count; i++)
48+
foreach (var mapping in mappings)
4949
{
50-
var mapping = mappings[i];
5150
var propertyOptions = entityOptions.GetPropertyOptions(mapping.Source);
5251

5352
sb.Append(',').AppendLine();
@@ -118,9 +117,11 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
118117
throw new NotImplementedException(mapping.TypeName.ToString());
119118
}
120119

121-
sb.Append(") AS [").Append(targetName).Append(']');
120+
sb.Append(") [").Append(targetName).Append(']');
122121
}
123122

123+
AppendUnmappedProperties(sb, mappings);
124+
124125
sb.AppendLine();
125126
sb.Append("FROM {0}.nodes('/R[1]/V') N(I)").AppendLine();
126127
sb.Append("ORDER BY [").Append(QueryableValuesEntity.IndexPropertyName).Append(']');
@@ -131,6 +132,26 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
131132
{
132133
StringBuilderPool.Return(sb);
133134
}
135+
136+
static void AppendUnmappedProperties(System.Text.StringBuilder sb, IReadOnlyList< EntityPropertyMapping> mappings)
137+
{
138+
var hasUnmappedProperty = false;
139+
140+
foreach (var unmappedPropertyName in QueryableValuesEntity.GetUnmappedPropertyNames(mappings))
141+
{
142+
if (hasUnmappedProperty)
143+
{
144+
sb.Append(',');
145+
}
146+
else
147+
{
148+
hasUnmappedProperty = true;
149+
sb.Append(',').AppendLine().Append('\t');
150+
}
151+
152+
sb.Append("NULL[").Append(unmappedPropertyName).Append(']');
153+
}
154+
}
134155
}
135156
}
136157
}

src/SharedProjectProperties.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,6 @@
6060
<InternalsVisibleTo Include="BlazarTech.QueryableValues.SqlServer.Tests.EFCore5" />
6161
<InternalsVisibleTo Include="BlazarTech.QueryableValues.SqlServer.Tests.EFCore6" />
6262
<InternalsVisibleTo Include="BlazarTech.QueryableValues.SqlServer.Tests.EFCore7" />
63+
<InternalsVisibleTo Include="BlazarTech.QueryableValues.SqlServer.Tests.EFCore8" />
6364
</ItemGroup>
6465
</Project>

tests/QueryableValues.SqlServer.Tests.EFCore3/QueryableValues.SqlServer.Tests.EFCore3.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<Import Project="../SharedTestProjectProperties.xml" />
33

44
<PropertyGroup>
5-
<TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>
5+
<TargetFrameworks>net8.0</TargetFrameworks>
66
<AssemblyName>BlazarTech.QueryableValues.SqlServer.Tests.EFCore3</AssemblyName>
77
<DefineConstants>$(DefineConstants);TESTS;EFCORE3</DefineConstants>
88
</PropertyGroup>

tests/QueryableValues.SqlServer.Tests.EFCore5/QueryableValues.SqlServer.Tests.EFCore5.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<Import Project="../SharedTestProjectProperties.xml" />
33

44
<PropertyGroup>
5-
<TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>
5+
<TargetFrameworks>net8.0</TargetFrameworks>
66
<AssemblyName>BlazarTech.QueryableValues.SqlServer.Tests.EFCore5</AssemblyName>
77
<DefineConstants>$(DefineConstants);TESTS;EFCORE5</DefineConstants>
88
</PropertyGroup>

tests/QueryableValues.SqlServer.Tests.EFCore6/QueryableValues.SqlServer.Tests.EFCore6.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<Import Project="../SharedTestProjectProperties.xml" />
33

44
<PropertyGroup>
5-
<TargetFrameworks>net6.0</TargetFrameworks>
5+
<TargetFrameworks>net8.0</TargetFrameworks>
66
<AssemblyName>BlazarTech.QueryableValues.SqlServer.Tests.EFCore6</AssemblyName>
77
<DefineConstants>$(DefineConstants);TESTS;EFCORE6</DefineConstants>
88
</PropertyGroup>

0 commit comments

Comments
 (0)