Skip to content

Commit db5fdc2

Browse files
author
MPCoreDeveloper
committed
added the new functional libraries to the solution
1 parent 0ed7902 commit db5fdc2

22 files changed

+1666
-0
lines changed

.github/copilot-instructions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
- Prefer Microsoft-backed packages by default.
2727
- If a non-Microsoft package is used (e.g., Serilog), keep it on latest stable and avoid deprecated versions.
2828
- Avoid prerelease packages unless explicitly requested.
29+
- Favor modular package design with production dependencies flowing through transitive NuGet references to core packages.
2930

3031
## Project-Specific Rules
3132
- Custom requirement A.

SharpCoreDB.sln

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,26 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CQRS", "CQRS", "{16246662-2
197197
EndProject
198198
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrderManagement.CqrsDemo", "Examples\CQRS\OrderManagement.CqrsDemo\OrderManagement.CqrsDemo.csproj", "{7BBCA0B4-D868-C04E-8748-21DE9A02486F}"
199199
EndProject
200+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCoreDB.AppHost", "src\SharpCoreDB.AppHost\SharpCoreDB.AppHost.csproj", "{532DCF54-42EE-41C6-AC93-4DB59425C017}"
201+
EndProject
202+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCoreDB.Functional", "src\SharpCoreDB.Functional\SharpCoreDB.Functional.csproj", "{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}"
203+
EndProject
204+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCoreDB.Functional.Dapper", "src\SharpCoreDB.Functional.Dapper\SharpCoreDB.Functional.Dapper.csproj", "{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}"
205+
EndProject
206+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCoreDB.Functional.EntityFrameworkCore", "src\SharpCoreDB.Functional.EntityFrameworkCore\SharpCoreDB.Functional.EntityFrameworkCore.csproj", "{67976C63-C341-4D9D-A805-812B565E7CC9}"
207+
EndProject
208+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickZvecTest", "tests\benchmarks\QuickZvecTest\QuickZvecTest.csproj", "{DD9375E8-B651-4EAA-81C7-7AFD8042388D}"
209+
EndProject
210+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCoreDB.Benchmarks.Comparative", "tests\benchmarks\SharpCoreDB.Benchmarks.Comparative\SharpCoreDB.Benchmarks.Comparative.csproj", "{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}"
211+
EndProject
212+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiagTest", "tests\DiagTest\DiagTest.csproj", "{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}"
213+
EndProject
214+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Manual", "Manual", "{40390A80-53BD-0A49-574D-A612AE6096E6}"
215+
EndProject
216+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SingleFileTest", "tests\Manual\SingleFileTest\SingleFileTest.csproj", "{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}"
217+
EndProject
218+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCoreDB.Analytics.Tests", "tests\SharpCoreDB.Analytics.Tests\SharpCoreDB.Analytics.Tests.csproj", "{B979F477-9678-43B2-8050-F2EBB9490C11}"
219+
EndProject
200220
Global
201221
GlobalSection(SolutionConfigurationPlatforms) = preSolution
202222
Debug|Any CPU = Debug|Any CPU
@@ -711,6 +731,114 @@ Global
711731
{7BBCA0B4-D868-C04E-8748-21DE9A02486F}.Release|x64.Build.0 = Release|Any CPU
712732
{7BBCA0B4-D868-C04E-8748-21DE9A02486F}.Release|x86.ActiveCfg = Release|Any CPU
713733
{7BBCA0B4-D868-C04E-8748-21DE9A02486F}.Release|x86.Build.0 = Release|Any CPU
734+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
735+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Debug|Any CPU.Build.0 = Debug|Any CPU
736+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Debug|x64.ActiveCfg = Debug|Any CPU
737+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Debug|x64.Build.0 = Debug|Any CPU
738+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Debug|x86.ActiveCfg = Debug|Any CPU
739+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Debug|x86.Build.0 = Debug|Any CPU
740+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Release|Any CPU.ActiveCfg = Release|Any CPU
741+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Release|Any CPU.Build.0 = Release|Any CPU
742+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Release|x64.ActiveCfg = Release|Any CPU
743+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Release|x64.Build.0 = Release|Any CPU
744+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Release|x86.ActiveCfg = Release|Any CPU
745+
{532DCF54-42EE-41C6-AC93-4DB59425C017}.Release|x86.Build.0 = Release|Any CPU
746+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
747+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
748+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Debug|x64.ActiveCfg = Debug|Any CPU
749+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Debug|x64.Build.0 = Debug|Any CPU
750+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Debug|x86.ActiveCfg = Debug|Any CPU
751+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Debug|x86.Build.0 = Debug|Any CPU
752+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
753+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Release|Any CPU.Build.0 = Release|Any CPU
754+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Release|x64.ActiveCfg = Release|Any CPU
755+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Release|x64.Build.0 = Release|Any CPU
756+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Release|x86.ActiveCfg = Release|Any CPU
757+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD}.Release|x86.Build.0 = Release|Any CPU
758+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
759+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
760+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Debug|x64.ActiveCfg = Debug|Any CPU
761+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Debug|x64.Build.0 = Debug|Any CPU
762+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Debug|x86.ActiveCfg = Debug|Any CPU
763+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Debug|x86.Build.0 = Debug|Any CPU
764+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
765+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Release|Any CPU.Build.0 = Release|Any CPU
766+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Release|x64.ActiveCfg = Release|Any CPU
767+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Release|x64.Build.0 = Release|Any CPU
768+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Release|x86.ActiveCfg = Release|Any CPU
769+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8}.Release|x86.Build.0 = Release|Any CPU
770+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
771+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
772+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Debug|x64.ActiveCfg = Debug|Any CPU
773+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Debug|x64.Build.0 = Debug|Any CPU
774+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Debug|x86.ActiveCfg = Debug|Any CPU
775+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Debug|x86.Build.0 = Debug|Any CPU
776+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
777+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Release|Any CPU.Build.0 = Release|Any CPU
778+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Release|x64.ActiveCfg = Release|Any CPU
779+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Release|x64.Build.0 = Release|Any CPU
780+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Release|x86.ActiveCfg = Release|Any CPU
781+
{67976C63-C341-4D9D-A805-812B565E7CC9}.Release|x86.Build.0 = Release|Any CPU
782+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
783+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Debug|Any CPU.Build.0 = Debug|Any CPU
784+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Debug|x64.ActiveCfg = Debug|Any CPU
785+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Debug|x64.Build.0 = Debug|Any CPU
786+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Debug|x86.ActiveCfg = Debug|Any CPU
787+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Debug|x86.Build.0 = Debug|Any CPU
788+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Release|Any CPU.ActiveCfg = Release|Any CPU
789+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Release|Any CPU.Build.0 = Release|Any CPU
790+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Release|x64.ActiveCfg = Release|Any CPU
791+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Release|x64.Build.0 = Release|Any CPU
792+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Release|x86.ActiveCfg = Release|Any CPU
793+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D}.Release|x86.Build.0 = Release|Any CPU
794+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
795+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Debug|Any CPU.Build.0 = Debug|Any CPU
796+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Debug|x64.ActiveCfg = Debug|Any CPU
797+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Debug|x64.Build.0 = Debug|Any CPU
798+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Debug|x86.ActiveCfg = Debug|Any CPU
799+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Debug|x86.Build.0 = Debug|Any CPU
800+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Release|Any CPU.ActiveCfg = Release|Any CPU
801+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Release|Any CPU.Build.0 = Release|Any CPU
802+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Release|x64.ActiveCfg = Release|Any CPU
803+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Release|x64.Build.0 = Release|Any CPU
804+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Release|x86.ActiveCfg = Release|Any CPU
805+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F}.Release|x86.Build.0 = Release|Any CPU
806+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
807+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
808+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Debug|x64.ActiveCfg = Debug|Any CPU
809+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Debug|x64.Build.0 = Debug|Any CPU
810+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Debug|x86.ActiveCfg = Debug|Any CPU
811+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Debug|x86.Build.0 = Debug|Any CPU
812+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
813+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Release|Any CPU.Build.0 = Release|Any CPU
814+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Release|x64.ActiveCfg = Release|Any CPU
815+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Release|x64.Build.0 = Release|Any CPU
816+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Release|x86.ActiveCfg = Release|Any CPU
817+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB}.Release|x86.Build.0 = Release|Any CPU
818+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
819+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Debug|Any CPU.Build.0 = Debug|Any CPU
820+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Debug|x64.ActiveCfg = Debug|Any CPU
821+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Debug|x64.Build.0 = Debug|Any CPU
822+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Debug|x86.ActiveCfg = Debug|Any CPU
823+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Debug|x86.Build.0 = Debug|Any CPU
824+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Release|Any CPU.ActiveCfg = Release|Any CPU
825+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Release|Any CPU.Build.0 = Release|Any CPU
826+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Release|x64.ActiveCfg = Release|Any CPU
827+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Release|x64.Build.0 = Release|Any CPU
828+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Release|x86.ActiveCfg = Release|Any CPU
829+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47}.Release|x86.Build.0 = Release|Any CPU
830+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
831+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Debug|Any CPU.Build.0 = Debug|Any CPU
832+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Debug|x64.ActiveCfg = Debug|Any CPU
833+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Debug|x64.Build.0 = Debug|Any CPU
834+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Debug|x86.ActiveCfg = Debug|Any CPU
835+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Debug|x86.Build.0 = Debug|Any CPU
836+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Release|Any CPU.ActiveCfg = Release|Any CPU
837+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Release|Any CPU.Build.0 = Release|Any CPU
838+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Release|x64.ActiveCfg = Release|Any CPU
839+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Release|x64.Build.0 = Release|Any CPU
840+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Release|x86.ActiveCfg = Release|Any CPU
841+
{B979F477-9678-43B2-8050-F2EBB9490C11}.Release|x86.Build.0 = Release|Any CPU
714842
EndGlobalSection
715843
GlobalSection(SolutionProperties) = preSolution
716844
HideSolutionNode = FALSE
@@ -771,6 +899,16 @@ Global
771899
{63D04743-D386-4623-B858-FF0501D6FAB1} = {A1B2C3D4-E5F6-4A7B-8C9D-0E1F2A3B4C5D}
772900
{16246662-205B-4B38-9C72-5386FD85A4B4} = {2F8A8533-DAA8-4CF9-A6C0-2F663AF7FD2E}
773901
{7BBCA0B4-D868-C04E-8748-21DE9A02486F} = {16246662-205B-4B38-9C72-5386FD85A4B4}
902+
{532DCF54-42EE-41C6-AC93-4DB59425C017} = {F8B5E3A4-1C2D-4E5F-8B9A-1D2E3F4A5B6C}
903+
{B7C3FE06-9C25-46F1-BDE4-C37A51192CDD} = {F8B5E3A4-1C2D-4E5F-8B9A-1D2E3F4A5B6C}
904+
{4D7E752E-F1E9-4580-A60F-6F3F31CBD8A8} = {F8B5E3A4-1C2D-4E5F-8B9A-1D2E3F4A5B6C}
905+
{67976C63-C341-4D9D-A805-812B565E7CC9} = {F8B5E3A4-1C2D-4E5F-8B9A-1D2E3F4A5B6C}
906+
{DD9375E8-B651-4EAA-81C7-7AFD8042388D} = {ADE64136-A476-B27C-8EC3-F370E4C13F04}
907+
{4C8E3F7D-22E6-4BFE-9502-E23850E6D27F} = {ADE64136-A476-B27C-8EC3-F370E4C13F04}
908+
{C44050FB-AB26-402B-9F6B-6AD4B67FF0EB} = {A1B2C3D4-E5F6-4A7B-8C9D-0E1F2A3B4C5D}
909+
{40390A80-53BD-0A49-574D-A612AE6096E6} = {A1B2C3D4-E5F6-4A7B-8C9D-0E1F2A3B4C5D}
910+
{D79F43FC-C7BC-4B38-BB97-9F4E50A89D47} = {40390A80-53BD-0A49-574D-A612AE6096E6}
911+
{B979F477-9678-43B2-8050-F2EBB9490C11} = {A1B2C3D4-E5F6-4A7B-8C9D-0E1F2A3B4C5D}
774912
EndGlobalSection
775913
GlobalSection(ExtensibilityGlobals) = postSolution
776914
SolutionGuid = {F40825F5-26A1-4E85-9D0A-B0121A7ED5F8}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace SharpCoreDB.Functional.Dapper;
2+
3+
using SharpCoreDB.Interfaces;
4+
5+
/// <summary>
6+
/// Entry-point extensions for Dapper functional adapters.
7+
/// </summary>
8+
public static class FunctionalDapperExtensions
9+
{
10+
/// <summary>
11+
/// Creates a functional Dapper wrapper from an <see cref="IDatabase"/> instance.
12+
/// </summary>
13+
/// <param name="database">The source SharpCoreDB instance.</param>
14+
/// <returns>The functional Dapper wrapper.</returns>
15+
public static FunctionalDapperDb FunctionalDapper(this IDatabase database)
16+
{
17+
ArgumentNullException.ThrowIfNull(database);
18+
return new FunctionalDapperDb(database);
19+
}
20+
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
namespace SharpCoreDB.Functional.Dapper;
2+
3+
using LanguageExt;
4+
using LanguageExt.Common;
5+
using SharpCoreDB.Extensions;
6+
using SharpCoreDB.Interfaces;
7+
using static LanguageExt.Prelude;
8+
9+
/// <summary>
10+
/// Functional adapter over SharpCoreDB Dapper extension operations with Option/Fin return types.
11+
/// </summary>
12+
/// <param name="database">The underlying SharpCoreDB database instance.</param>
13+
public sealed class FunctionalDapperDb(IDatabase database)
14+
{
15+
private readonly IDatabase _database = database ?? throw new ArgumentNullException(nameof(database));
16+
17+
/// <summary>
18+
/// Gets a single row by id from a table.
19+
/// </summary>
20+
/// <typeparam name="T">The result type.</typeparam>
21+
/// <typeparam name="TId">The id type.</typeparam>
22+
/// <param name="tableName">The table name.</param>
23+
/// <param name="id">The identifier value.</param>
24+
/// <param name="idColumn">The id column name.</param>
25+
/// <returns>Some value when found; none otherwise.</returns>
26+
public async Task<Option<T>> GetByIdAsync<T, TId>(string tableName, TId id, string idColumn = "Id")
27+
{
28+
ArgumentException.ThrowIfNullOrWhiteSpace(tableName);
29+
ArgumentException.ThrowIfNullOrWhiteSpace(idColumn);
30+
31+
var sql = $"SELECT * FROM {tableName} WHERE {idColumn} = @Id LIMIT 1";
32+
var value = await _database.QueryFirstOrDefaultAsync<T>(sql, new { Id = id }).ConfigureAwait(false);
33+
return Optional(value);
34+
}
35+
36+
/// <summary>
37+
/// Executes a query expected to return at most one row.
38+
/// </summary>
39+
/// <typeparam name="T">The result type.</typeparam>
40+
/// <param name="sql">SQL text.</param>
41+
/// <param name="param">Optional parameters.</param>
42+
/// <returns>Some value when a row exists; none otherwise.</returns>
43+
public async Task<Option<T>> FindOneAsync<T>(string sql, object? param = null)
44+
{
45+
ArgumentException.ThrowIfNullOrWhiteSpace(sql);
46+
47+
var value = await _database.QueryFirstOrDefaultAsync<T>(sql, param).ConfigureAwait(false);
48+
return Optional(value);
49+
}
50+
51+
/// <summary>
52+
/// Executes a query and returns a functional sequence.
53+
/// </summary>
54+
/// <typeparam name="T">The row type.</typeparam>
55+
/// <param name="sql">SQL text.</param>
56+
/// <param name="param">Optional parameters.</param>
57+
/// <returns>A sequence of mapped values.</returns>
58+
public async Task<Seq<T>> QueryAsync<T>(string sql, object? param = null)
59+
{
60+
ArgumentException.ThrowIfNullOrWhiteSpace(sql);
61+
62+
var rows = await _database.QueryAsync<T>(sql, param).ConfigureAwait(false);
63+
return toSeq(rows);
64+
}
65+
66+
/// <summary>
67+
/// Executes an INSERT statement and returns a functional result.
68+
/// </summary>
69+
/// <param name="sql">SQL text.</param>
70+
/// <param name="param">Optional parameters.</param>
71+
/// <returns>Success when command executes; failure with error otherwise.</returns>
72+
public async Task<Fin<Unit>> InsertAsync(string sql, object? param = null)
73+
{
74+
ArgumentException.ThrowIfNullOrWhiteSpace(sql);
75+
76+
try
77+
{
78+
await _database.ExecuteAsync(sql, param).ConfigureAwait(false);
79+
return FinSucc(unit);
80+
}
81+
catch (Exception ex)
82+
{
83+
return FinFail<Unit>(Error.New(ex));
84+
}
85+
}
86+
87+
/// <summary>
88+
/// Executes an UPDATE statement and returns a functional result.
89+
/// </summary>
90+
/// <param name="sql">SQL text.</param>
91+
/// <param name="param">Optional parameters.</param>
92+
/// <returns>Success when command executes; failure with error otherwise.</returns>
93+
public async Task<Fin<Unit>> UpdateAsync(string sql, object? param = null)
94+
{
95+
ArgumentException.ThrowIfNullOrWhiteSpace(sql);
96+
97+
try
98+
{
99+
await _database.ExecuteAsync(sql, param).ConfigureAwait(false);
100+
return FinSucc(unit);
101+
}
102+
catch (Exception ex)
103+
{
104+
return FinFail<Unit>(Error.New(ex));
105+
}
106+
}
107+
108+
/// <summary>
109+
/// Executes a DELETE statement and returns a functional result.
110+
/// </summary>
111+
/// <param name="sql">SQL text.</param>
112+
/// <param name="param">Optional parameters.</param>
113+
/// <returns>Success when command executes; failure with error otherwise.</returns>
114+
public async Task<Fin<Unit>> DeleteAsync(string sql, object? param = null)
115+
{
116+
ArgumentException.ThrowIfNullOrWhiteSpace(sql);
117+
118+
try
119+
{
120+
await _database.ExecuteAsync(sql, param).ConfigureAwait(false);
121+
return FinSucc(unit);
122+
}
123+
catch (Exception ex)
124+
{
125+
return FinFail<Unit>(Error.New(ex));
126+
}
127+
}
128+
129+
/// <summary>
130+
/// Executes a COUNT query.
131+
/// </summary>
132+
/// <param name="sql">SQL count query.</param>
133+
/// <param name="param">Optional parameters.</param>
134+
/// <returns>Count result.</returns>
135+
public async Task<long> CountAsync(string sql, object? param = null)
136+
{
137+
ArgumentException.ThrowIfNullOrWhiteSpace(sql);
138+
var value = await _database.ExecuteScalarAsync<long>(sql, param).ConfigureAwait(false);
139+
return value;
140+
}
141+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# SharpCoreDB.Functional.Dapper
2+
3+
Dapper adapter package for `SharpCoreDB.Functional`.
4+
5+
## Purpose
6+
7+
This module provides functional wrappers over Dapper operations:
8+
9+
- `Task<Option<T>>` for optional reads
10+
- `Task<Fin<Unit>>` for write operations
11+
- `Task<Seq<T>>` for sequence-based queries
12+
13+
## Entry points
14+
15+
- `IDbConnection.Functional()`
16+
- `IDatabase.FunctionalDapper()`
17+
18+
## Production dependency model
19+
20+
In production NuGet usage, this package references `SharpCoreDB.Functional` and `SharpCoreDB.Extensions` as package dependencies, which provide transitive core references.

0 commit comments

Comments
 (0)