feat: add F# tryQueryFirst
This commit is contained in:
parent
4dbba5c2f3
commit
ad62629a1d
|
@ -21,7 +21,9 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Base\Base.csproj" />
|
||||
<ProjectReference Include="..\FruityFoundation.DataAccess.Abstractions\FruityFoundation.DataAccess.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\FsBase\FsBase.fsproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -5,6 +5,7 @@ open System.Collections.Generic
|
|||
open System.Threading
|
||||
open FSharp.Control
|
||||
open FruityFoundation.DataAccess.Abstractions
|
||||
open FruityFoundation.FsBase
|
||||
|
||||
let private toKeyValuePair (parms : (string * obj) seq) =
|
||||
parms
|
||||
|
@ -22,6 +23,11 @@ let querySingle<'a> (connection : IDatabaseConnection<ReadOnly>) (cancellationTo
|
|||
return! connection.QuerySingle<'a>(sql, parms |> toKeyValuePair, cancellationToken)
|
||||
}
|
||||
|
||||
let tryQueryFirst<'a> (connection : ReadOnly IDatabaseConnection) (cancellationToken : CancellationToken) (sql : string) (parms : (string * obj) seq) = task {
|
||||
let! result = connection.TryQueryFirst(sql, parms |> toKeyValuePair, cancellationToken)
|
||||
return result |> Option.fromMaybe
|
||||
}
|
||||
|
||||
let execute (connection : IDatabaseConnection<ReadOnly>) (cancellationToken : CancellationToken) (sql : string) (parms : (string * obj) seq) = task {
|
||||
return! connection.Execute(sql, parms |> toKeyValuePair, cancellationToken)
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ open System.Collections.Generic
|
|||
open System.Threading
|
||||
open FSharp.Control
|
||||
open FruityFoundation.DataAccess.Abstractions
|
||||
open FruityFoundation.FsBase
|
||||
|
||||
let private toKeyValuePair (parms : (string * obj) seq) =
|
||||
parms
|
||||
|
@ -22,6 +23,11 @@ let querySingle<'a> (connection : IDatabaseConnection<ReadWrite>) (cancellationT
|
|||
return! connection.QuerySingle<'a>(sql, parms |> toKeyValuePair, cancellationToken)
|
||||
}
|
||||
|
||||
let tryQueryFirst<'a> (connection : ReadOnly IDatabaseConnection) (cancellationToken : CancellationToken) (sql : string) (parms : (string * obj) seq) = task {
|
||||
let! result = connection.TryQueryFirst(sql, parms |> toKeyValuePair, cancellationToken)
|
||||
return result |> Option.fromMaybe
|
||||
}
|
||||
|
||||
let execute (connection : IDatabaseConnection<ReadWrite>) (cancellationToken : CancellationToken) (sql : string) (parms : (string * obj) seq) = task {
|
||||
return! connection.Execute(sql, parms |> toKeyValuePair, cancellationToken)
|
||||
}
|
||||
|
|
|
@ -16,4 +16,8 @@
|
|||
<None Include="..\LICENSE" Pack="true" PackagePath="" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Base\Base.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Data.Common;
|
||||
using FruityFoundation.Base.Structures;
|
||||
|
||||
namespace FruityFoundation.DataAccess.Abstractions;
|
||||
|
||||
|
@ -8,6 +9,7 @@ public interface IDatabaseConnection<out TConnectionType> where TConnectionType
|
|||
public Task<IEnumerable<T>> Query<T>(string sql, object? param = null, CancellationToken cancellationToken = default);
|
||||
public IAsyncEnumerable<T> QueryUnbuffered<T>(string sql, object? param = null, CancellationToken cancellationToken = default);
|
||||
public Task<T> QuerySingle<T>(string sql, object? param = null, CancellationToken cancellationToken = default);
|
||||
public Task<Maybe<T>> TryQueryFirst<T>(string sql, object? param = null, CancellationToken cancellationToken = default);
|
||||
public Task Execute(string sql, object? param = null, CancellationToken cancellationToken = default);
|
||||
public Task<T?> ExecuteScalar<T>(string sql, object? param = null, CancellationToken cancellationToken = default);
|
||||
public Task<DbDataReader> ExecuteReader(string sql, object? param = null, CancellationToken cancellationToken = default);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Data;
|
||||
using FruityFoundation.Base.Structures;
|
||||
|
||||
namespace FruityFoundation.DataAccess.Abstractions;
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using System.Data.Common;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Dapper;
|
||||
using FruityFoundation.Base.Structures;
|
||||
using FruityFoundation.DataAccess.Abstractions;
|
||||
|
||||
namespace FruityFoundation.DataAccess.Core;
|
||||
|
@ -59,6 +60,16 @@ public class DbTransaction<TConnectionType> : IDatabaseTransactionConnection<TCo
|
|||
return await conn.QuerySingleAsync<T>(command);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<Maybe<T>> TryQueryFirst<T>(string sql, object? param = null, CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (_transaction.Connection is not { } conn)
|
||||
throw new InvalidOperationException("Transaction connection cannot be null");
|
||||
|
||||
return await conn.QueryUnbufferedAsync<T>(sql, param, transaction: _transaction)
|
||||
.FirstOrEmptyAsync(cancellationToken);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task Execute(string sql, object? param = null, CancellationToken cancellationToken = default)
|
||||
{
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Base\Base.csproj" />
|
||||
<ProjectReference Include="..\FruityFoundation.DataAccess.Abstractions\FruityFoundation.DataAccess.Abstractions.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
using System.Data.Common;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Dapper;
|
||||
using FruityFoundation.Base.Structures;
|
||||
using FruityFoundation.DataAccess.Abstractions;
|
||||
|
||||
namespace FruityFoundation.DataAccess.Core;
|
||||
|
@ -48,6 +49,15 @@ public class NonTransactionalDbConnection<TConnectionType> : INonTransactionalDb
|
|||
CancellationToken cancellationToken = default
|
||||
) => await _connection.QuerySingleAsync<T>(new CommandDefinition(sql, param, cancellationToken: cancellationToken));
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<Maybe<T>> TryQueryFirst<T>(
|
||||
string sql,
|
||||
object? param = null,
|
||||
CancellationToken cancellationToken = default
|
||||
) =>
|
||||
await _connection.QueryUnbufferedAsync<T>(sql, param, transaction: null)
|
||||
.FirstOrEmptyAsync(cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task Execute(
|
||||
string sql,
|
||||
|
|
Loading…
Reference in New Issue
Block a user