Skip to content

Commit f5c0016

Browse files
Update Fortunes to use Razor templating (#1801)
Updates the Fortunes implementations for Minimal and Platform to use Razor .cshtml templates with custom base classes intended for rendering using the RazorSlices package (no MVC). Also removes target frameworks lower than net6.0 and resolves some compiler warnings/info messages.
1 parent 284d02f commit f5c0016

33 files changed

+636
-415
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ global.json
1717
# User-specific files (MonoDevelop/Xamarin Studio)
1818
*.userprefs
1919

20+
# Crank results
21+
.crank/
22+
2023
# Build results
2124
[Dd]ebug/
2225
[Dd]ebugPublic/

src/BenchmarksApps.sln

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.6.33416.333
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicMinimalApi", "BenchmarksApps\BasicMinimalApi\BasicMinimalApi.csproj", "{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}"
7+
EndProject
8+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelloWorldMiddleware", "BenchmarksApps\HelloWorldMiddleware\HelloWorldMiddleware.csproj", "{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}"
9+
EndProject
10+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelloWorldMvc", "BenchmarksApps\HelloWorldMvc\HelloWorldMvc.csproj", "{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}"
11+
EndProject
12+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MapAction", "BenchmarksApps\MapAction\MapAction.csproj", "{58029BDE-4A26-4819-8776-A1B1B6075C51}"
13+
EndProject
14+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mvc", "BenchmarksApps\Mvc\Mvc.csproj", "{34448A4F-80AC-4795-B644-BED3227A0086}"
15+
EndProject
16+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StaticFiles", "BenchmarksApps\StaticFiles\StaticFiles.csproj", "{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}"
17+
EndProject
18+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DistributedCache", "BenchmarksApps\DistributedCache\DistributedCache.csproj", "{AB0D447E-476F-4482-A844-BC2654C308F5}"
19+
EndProject
20+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{D8A014FB-3C99-4831-9FFB-F4A89A48D8BD}"
21+
EndProject
22+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicGrpc", "BenchmarksApps\Grpc\BasicGrpc\BasicGrpc.csproj", "{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}"
23+
EndProject
24+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GrpcHttpApiServer", "GrpcHttpApiServer", "{9E4AF835-2A78-4012-B0B5-9DA41ACDC716}"
25+
EndProject
26+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "BenchmarksApps\Grpc\GrpcHttpApiServer\Server\Server.csproj", "{20757830-EA66-4962-BDBB-A101A2062A2C}"
27+
EndProject
28+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TechEmpower", "TechEmpower", "{B6DB234C-8F80-4160-B95D-D70AFC444A3D}"
29+
EndProject
30+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Minimal", "BenchmarksApps\TechEmpower\Minimal\Minimal.csproj", "{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}"
31+
EndProject
32+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mvc", "BenchmarksApps\TechEmpower\Mvc\Mvc.csproj", "{E68B58F8-40EA-49EA-A126-0B67F2BE7343}"
33+
EndProject
34+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlatformBenchmarks", "BenchmarksApps\TechEmpower\PlatformBenchmarks\PlatformBenchmarks.csproj", "{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}"
35+
EndProject
36+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{689C58F6-8DF0-4565-887F-C9A9BDA757D8}"
37+
ProjectSection(SolutionItems) = preProject
38+
Directory.Build.props = Directory.Build.props
39+
Directory.Build.targets = Directory.Build.targets
40+
EndProjectSection
41+
EndProject
42+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildPerformance", "BenchmarksApps\BuildPerformance\BuildPerformance.csproj", "{2E953AFB-4900-4B5D-9E78-819E950CD365}"
43+
EndProject
44+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SignalR", "SignalR", "{398A40DA-FE1D-4B4D-A580-A33E29885553}"
45+
EndProject
46+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkServer", "BenchmarksApps\SignalR\BenchmarkServer.csproj", "{D8F11F87-823F-4864-926D-5F66448A5C13}"
47+
EndProject
48+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Websocket", "Websocket", "{6A69DE6C-07A6-4ABE-A4D2-0F983A33BBF8}"
49+
EndProject
50+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkServer", "BenchmarksApps\Websocket\BenchmarkServer.csproj", "{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}"
51+
EndProject
52+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcpEcho", "BenchmarksApps\TcpEcho\TcpEcho.csproj", "{436118C1-B9A7-4966-86AB-6F2477B6B201}"
53+
EndProject
54+
Global
55+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
56+
Debug|Any CPU = Debug|Any CPU
57+
Release|Any CPU = Release|Any CPU
58+
EndGlobalSection
59+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
60+
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
61+
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
62+
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
63+
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Release|Any CPU.Build.0 = Release|Any CPU
64+
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
65+
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Debug|Any CPU.Build.0 = Debug|Any CPU
66+
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Release|Any CPU.ActiveCfg = Release|Any CPU
67+
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Release|Any CPU.Build.0 = Release|Any CPU
68+
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
69+
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
70+
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
71+
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Release|Any CPU.Build.0 = Release|Any CPU
72+
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
73+
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Debug|Any CPU.Build.0 = Debug|Any CPU
74+
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Release|Any CPU.ActiveCfg = Release|Any CPU
75+
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Release|Any CPU.Build.0 = Release|Any CPU
76+
{34448A4F-80AC-4795-B644-BED3227A0086}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77+
{34448A4F-80AC-4795-B644-BED3227A0086}.Debug|Any CPU.Build.0 = Debug|Any CPU
78+
{34448A4F-80AC-4795-B644-BED3227A0086}.Release|Any CPU.ActiveCfg = Release|Any CPU
79+
{34448A4F-80AC-4795-B644-BED3227A0086}.Release|Any CPU.Build.0 = Release|Any CPU
80+
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
81+
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Debug|Any CPU.Build.0 = Debug|Any CPU
82+
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Release|Any CPU.ActiveCfg = Release|Any CPU
83+
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Release|Any CPU.Build.0 = Release|Any CPU
84+
{AB0D447E-476F-4482-A844-BC2654C308F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
85+
{AB0D447E-476F-4482-A844-BC2654C308F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
86+
{AB0D447E-476F-4482-A844-BC2654C308F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
87+
{AB0D447E-476F-4482-A844-BC2654C308F5}.Release|Any CPU.Build.0 = Release|Any CPU
88+
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
89+
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
90+
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
91+
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Release|Any CPU.Build.0 = Release|Any CPU
92+
{20757830-EA66-4962-BDBB-A101A2062A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
93+
{20757830-EA66-4962-BDBB-A101A2062A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
94+
{20757830-EA66-4962-BDBB-A101A2062A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
95+
{20757830-EA66-4962-BDBB-A101A2062A2C}.Release|Any CPU.Build.0 = Release|Any CPU
96+
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
97+
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
98+
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
99+
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Release|Any CPU.Build.0 = Release|Any CPU
100+
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
101+
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Debug|Any CPU.Build.0 = Debug|Any CPU
102+
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Release|Any CPU.ActiveCfg = Release|Any CPU
103+
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Release|Any CPU.Build.0 = Release|Any CPU
104+
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
105+
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
106+
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
107+
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Release|Any CPU.Build.0 = Release|Any CPU
108+
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
109+
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Debug|Any CPU.Build.0 = Debug|Any CPU
110+
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Release|Any CPU.ActiveCfg = Release|Any CPU
111+
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Release|Any CPU.Build.0 = Release|Any CPU
112+
{D8F11F87-823F-4864-926D-5F66448A5C13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
113+
{D8F11F87-823F-4864-926D-5F66448A5C13}.Debug|Any CPU.Build.0 = Debug|Any CPU
114+
{D8F11F87-823F-4864-926D-5F66448A5C13}.Release|Any CPU.ActiveCfg = Release|Any CPU
115+
{D8F11F87-823F-4864-926D-5F66448A5C13}.Release|Any CPU.Build.0 = Release|Any CPU
116+
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
117+
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Debug|Any CPU.Build.0 = Debug|Any CPU
118+
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Release|Any CPU.ActiveCfg = Release|Any CPU
119+
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Release|Any CPU.Build.0 = Release|Any CPU
120+
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
121+
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Debug|Any CPU.Build.0 = Debug|Any CPU
122+
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Release|Any CPU.ActiveCfg = Release|Any CPU
123+
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Release|Any CPU.Build.0 = Release|Any CPU
124+
EndGlobalSection
125+
GlobalSection(SolutionProperties) = preSolution
126+
HideSolutionNode = FALSE
127+
EndGlobalSection
128+
GlobalSection(NestedProjects) = preSolution
129+
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5} = {D8A014FB-3C99-4831-9FFB-F4A89A48D8BD}
130+
{9E4AF835-2A78-4012-B0B5-9DA41ACDC716} = {D8A014FB-3C99-4831-9FFB-F4A89A48D8BD}
131+
{20757830-EA66-4962-BDBB-A101A2062A2C} = {9E4AF835-2A78-4012-B0B5-9DA41ACDC716}
132+
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE} = {B6DB234C-8F80-4160-B95D-D70AFC444A3D}
133+
{E68B58F8-40EA-49EA-A126-0B67F2BE7343} = {B6DB234C-8F80-4160-B95D-D70AFC444A3D}
134+
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0} = {B6DB234C-8F80-4160-B95D-D70AFC444A3D}
135+
{D8F11F87-823F-4864-926D-5F66448A5C13} = {398A40DA-FE1D-4B4D-A580-A33E29885553}
136+
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E} = {6A69DE6C-07A6-4ABE-A4D2-0F983A33BBF8}
137+
EndGlobalSection
138+
GlobalSection(ExtensibilityGlobals) = postSolution
139+
SolutionGuid = {117072DC-DE12-4F74-90CA-692FA2BE8DCB}
140+
EndGlobalSection
141+
EndGlobal

src/BenchmarksApps/TechEmpower/Minimal/Database/Db.cs

Lines changed: 73 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -2,118 +2,101 @@
22
using Dapper;
33
using Minimal.Models;
44

5-
namespace Minimal.Database
5+
namespace Minimal.Database;
6+
7+
public class Db
68
{
7-
public class Db
9+
private static readonly Comparison<Fortune> FortuneSortComparison = (a, b) => string.CompareOrdinal(a.Message, b.Message);
10+
11+
private readonly DbProviderFactory _dbProviderFactory;
12+
private readonly string _connectionString;
13+
14+
public Db(AppSettings appSettings)
815
{
9-
private static readonly Comparison<Fortune> FortuneSortComparison = (a, b) => string.CompareOrdinal(a.Message, b.Message);
16+
ArgumentException.ThrowIfNullOrEmpty(appSettings.ConnectionString);
1017

11-
private static readonly Random _random = Random.Shared;
18+
_dbProviderFactory = Npgsql.NpgsqlFactory.Instance;
19+
_connectionString = appSettings.ConnectionString;
20+
}
1221

13-
private readonly DbProviderFactory _dbProviderFactory;
14-
private readonly string _connectionString;
22+
public Task<World> LoadSingleQueryRow()
23+
{
24+
using var db = _dbProviderFactory.CreateConnection();
25+
db!.ConnectionString = _connectionString;
1526

16-
public Db(AppSettings appSettings)
17-
{
18-
ArgumentNullException.ThrowIfNull(appSettings.ConnectionString);
27+
// Note: Don't need to open connection if only doing one thing; let dapper do it
28+
return ReadSingleRow(db);
29+
}
1930

20-
_dbProviderFactory = Npgsql.NpgsqlFactory.Instance;
21-
_connectionString = appSettings.ConnectionString;
22-
}
31+
static Task<World> ReadSingleRow(DbConnection db)
32+
{
33+
return db.QueryFirstOrDefaultAsync<World>(
34+
"SELECT id, randomnumber FROM world WHERE id = @Id",
35+
new { Id = Random.Shared.Next(1, 10001) });
36+
}
2337

24-
public Task<World> LoadSingleQueryRow()
25-
{
26-
using var db = _dbProviderFactory.CreateConnection();
27-
db!.ConnectionString = _connectionString;
38+
public async Task<World[]> LoadMultipleQueriesRows(int count)
39+
{
40+
count = Math.Clamp(count, 1, 500);
2841

29-
// Note: Don't need to open connection if only doing one thing; let dapper do it
30-
return ReadSingleRow(db);
31-
}
42+
var results = new World[count];
43+
using var db = _dbProviderFactory.CreateConnection();
44+
45+
db!.ConnectionString = _connectionString;
46+
await db.OpenAsync();
3247

33-
static Task<World> ReadSingleRow(DbConnection db)
48+
for (var i = 0; i < count; i++)
3449
{
35-
return db.QueryFirstOrDefaultAsync<World>(
36-
"SELECT id, randomnumber FROM world WHERE id = @Id",
37-
new { Id = _random.Next(1, 10001) });
50+
results[i] = await ReadSingleRow(db);
3851
}
3952

40-
public async Task<World[]> LoadMultipleQueriesRows(int count)
53+
return results;
54+
}
55+
56+
public async Task<World[]> LoadMultipleUpdatesRows(int count)
57+
{
58+
count = Math.Clamp(count, 1, 500);
59+
60+
var parameters = new Dictionary<string, object>();
61+
62+
using var db = _dbProviderFactory.CreateConnection();
63+
64+
db!.ConnectionString = _connectionString;
65+
await db.OpenAsync();
66+
67+
var results = new World[count];
68+
for (var i = 0; i < count; i++)
4169
{
42-
if (count <= 0)
43-
{
44-
count = 1;
45-
}
46-
else if (count > 500)
47-
{
48-
count = 500;
49-
}
50-
51-
var results = new World[count];
52-
using var db = _dbProviderFactory.CreateConnection();
53-
54-
db!.ConnectionString = _connectionString;
55-
await db.OpenAsync();
56-
57-
for (var i = 0; i < count; i++)
58-
{
59-
results[i] = await ReadSingleRow(db);
60-
}
61-
62-
return results;
70+
results[i] = await ReadSingleRow(db);
6371
}
6472

65-
public async Task<World[]> LoadMultipleUpdatesRows(int count)
73+
for (var i = 0; i < count; i++)
6674
{
67-
if (count <= 0)
68-
{
69-
count = 1;
70-
}
71-
else if (count > 500)
72-
{
73-
count = 500;
74-
}
75-
76-
var parameters = new Dictionary<string, object>();
77-
78-
using var db = _dbProviderFactory.CreateConnection();
79-
80-
db!.ConnectionString = _connectionString;
81-
await db.OpenAsync();
82-
83-
var results = new World[count];
84-
for (var i = 0; i < count; i++)
85-
{
86-
results[i] = await ReadSingleRow(db);
87-
}
88-
89-
for (var i = 0; i < count; i++)
90-
{
91-
var randomNumber = _random.Next(1, 10001);
92-
parameters[$"@Rn_{i}"] = randomNumber;
93-
parameters[$"@Id_{i}"] = results[i].Id;
94-
95-
results[i].RandomNumber = randomNumber;
96-
}
97-
98-
await db.ExecuteAsync(BatchUpdateString.Query(count), parameters);
99-
return results;
75+
var randomNumber = Random.Shared.Next(1, 10001);
76+
parameters[$"@Rn_{i}"] = randomNumber;
77+
parameters[$"@Id_{i}"] = results[i].Id;
78+
79+
results[i].RandomNumber = randomNumber;
10080
}
10181

102-
public async Task<List<Fortune>> LoadFortunesRows()
103-
{
104-
List<Fortune> result;
82+
await db.ExecuteAsync(BatchUpdateString.Query(count), parameters);
83+
return results;
84+
}
10585

106-
using var db = _dbProviderFactory.CreateConnection();
86+
public async Task<List<Fortune>> LoadFortunesRows()
87+
{
88+
List<Fortune> result;
10789

108-
db!.ConnectionString = _connectionString;
90+
using var db = _dbProviderFactory.CreateConnection();
10991

110-
// Note: don't need to open connection if only doing one thing; let dapper do it
111-
result = (await db.QueryAsync<Fortune>("SELECT id, message FROM fortune")).AsList();
92+
db!.ConnectionString = _connectionString;
11293

113-
result.Add(new Fortune(0, "Additional fortune added at request time."));
114-
result.Sort(FortuneSortComparison);
94+
// Note: don't need to open connection if only doing one thing; let dapper do it
95+
result = (await db.QueryAsync<Fortune>("SELECT id, message FROM fortune")).AsList();
11596

116-
return result;
117-
}
97+
result.Add(new Fortune(0, "Additional fortune added at request time."));
98+
result.Sort(FortuneSortComparison);
99+
100+
return result;
118101
}
119102
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
<Project Sdk="Microsoft.NET.Sdk.Web">
1+
<Project Sdk="Microsoft.NET.Sdk.Web">
22

33
<PropertyGroup>
44
<TargetFramework>net7.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<LangVersion>latest</LangVersion>
8+
<UserSecretsId>38063504-d08c-495a-89c9-daaad2f60f31</UserSecretsId>
89
</PropertyGroup>
910

1011
<ItemGroup>
1112
<PackageReference Include="Npgsql" Version="8.0.0-preview.1" />
1213
<PackageReference Include="Dapper" Version="2.0.123" />
14+
<PackageReference Include="RazorSlices" Version="0.3.0" />
1315
</ItemGroup>
1416

1517
</Project>

0 commit comments

Comments
 (0)