-
Notifications
You must be signed in to change notification settings - Fork 244
/
Copy pathDb.cs
52 lines (39 loc) · 1.63 KB
/
Db.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using Dapper;
using Npgsql;
using RazorPages.Models;
namespace RazorPages.Database;
public sealed class Db : IAsyncDisposable
{
private static readonly Comparison<Fortune> FortuneSortComparison = (a, b) => string.CompareOrdinal(a.Message, b.Message);
private readonly NpgsqlDataSource _dataSource;
public Db(AppSettings appSettings)
{
ArgumentException.ThrowIfNullOrEmpty(appSettings.ConnectionString);
#if NET8_0_OR_GREATER
_dataSource = new NpgsqlSlimDataSourceBuilder(appSettings.ConnectionString).Build();
#else
_dataSource = new NpgsqlDataSourceBuilder(appSettings.ConnectionString).Build();
#endif
}
[DapperAot, CacheCommand, StrictTypes, QueryColumns("id", "message")]
public async Task<List<Fortune>> LoadFortunesRowsDapper()
{
await using var connection = _dataSource.CreateConnection();
var result = (await connection.QueryAsync<Fortune>($"SELECT id, message FROM fortune")).AsList();
result.Add(new Fortune { Id = 0, Message = "Additional fortune added at request time." });
result.Sort(FortuneSortComparison);
return result;
}
public async Task<List<Fortune>> LoadFortunesRowsEf(AppDbContext dbContext)
{
var result = new List<Fortune>();
await foreach (var fortune in AppDbContext.FortunesQuery(dbContext))
{
result.Add(fortune);
}
result.Add(new Fortune { Id = 0, Message = "Additional fortune added at request time." });
result.Sort(FortuneSortComparison);
return result;
}
ValueTask IAsyncDisposable.DisposeAsync() => _dataSource.DisposeAsync();
}