CompileAsyncQuery: AccountLinker

This commit is contained in:
Anton Suhorukov 2023-05-25 10:58:09 +03:00
parent 6add1d1b9e
commit 2a15974880

View File

@ -86,11 +86,7 @@ public class AccountLinker
public async Task<IEnumerable<string>> GetLinkedObjectsByHashIdAsync(string hashid)
{
using var accountLinkContext = _accountLinkContextManager.CreateDbContext();
return await accountLinkContext.AccountLinks
.Where(r => r.UId == hashid)
.Where(r => r.Provider != string.Empty)
.Select(r => r.Id)
.ToListAsync();
return await AccountLinkerQueries.GetLinkedObjectsByHashIdAsync(accountLinkContext, hashid).ToListAsync();
}
public async Task<IEnumerable<LoginProfile>> GetLinkedProfilesAsync(string obj, string provider)
@ -145,19 +141,8 @@ public class AccountLinker
{
using var accountLinkContext = _accountLinkContextManager.CreateDbContext();
var accountLinkQuery = accountLinkContext.AccountLinks.Where(r => r.Id == obj);
var accountLink = await AccountLinkerQueries.GetAccountLinkAsync(accountLinkContext, obj, provider, hashId);
if (!string.IsNullOrEmpty(provider))
{
accountLinkQuery = accountLinkQuery.Where(r => r.Provider == provider);
}
if (!string.IsNullOrEmpty(hashId))
{
accountLinkQuery = accountLinkQuery.Where(r => r.UId == hashId);
}
var accountLink = await accountLinkQuery.FirstOrDefaultAsync();
accountLinkContext.AccountLinks.Remove(accountLink);
await accountLinkContext.SaveChangesAsync();
@ -167,12 +152,8 @@ public class AccountLinker
private async Task<List<LoginProfile>> GetLinkedProfilesFromDBAsync(string obj)
{
using var accountLinkContext = _accountLinkContextManager.CreateDbContext();
//Retrieve by uinque id
return (await accountLinkContext.AccountLinks
.Where(r => r.Id == obj)
.Select(r => r.Profile)
.ToListAsync())
return (await AccountLinkerQueries.GetLinkedProfilesFromDBAsync(accountLinkContext, obj).ToListAsync())
.ConvertAll(x => LoginProfile.CreateFromSerializedString(_signature, _instanceCrypto, x));
}
@ -185,3 +166,27 @@ public class AccountLinker
.ToDictionaryAsync(k => k.Id, v => LoginProfile.CreateFromSerializedString(_signature, _instanceCrypto, v.Profile));
}
}
file static class AccountLinkerQueries
{
public static readonly Func<AccountLinkContext, string, IAsyncEnumerable<string>> GetLinkedObjectsByHashIdAsync = Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(AccountLinkContext ctx, string hashid) =>
ctx.AccountLinks
.Where(r => r.UId == hashid)
.Where(r => r.Provider != string.Empty)
.Select(r => r.Id));
public static readonly Func<AccountLinkContext, string, string, string, Task<AccountLinks>> GetAccountLinkAsync = Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(AccountLinkContext ctx, string id, string provider, string hashId) =>
ctx.AccountLinks
.Where(r => r.Id == id)
.Where(r => !string.IsNullOrEmpty(provider) && r.Provider == provider)
.Where(r => !string.IsNullOrEmpty(hashId) && r.UId == hashId)
.FirstOrDefault());
public static readonly Func<AccountLinkContext, string, IAsyncEnumerable<string>> GetLinkedProfilesFromDBAsync = Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(AccountLinkContext ctx, string id) =>
ctx.AccountLinks
.Where(r => r.Id == id)
.Select(r => r.Profile));
}