From 259b6c1ce285dfb1606f2397533e9d62b53a992e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leynier=20Guti=C3=A9rrez=20Gonz=C3=A1lez?= Date: Thu, 19 May 2022 01:06:22 -0400 Subject: [PATCH] perf: use query as a method --- Gateways.Api/Controllers/DevicesController.cs | 5 +++-- .../Contracts/IRepository.cs | 3 ++- .../Services/IService.cs | 3 ++- .../Services/BaseService.cs | 17 ++++------------ .../Controllers/CrudApiControllerBase.cs | 8 ++++---- .../Repositories/BaseRepository.cs | 20 ++++--------------- 6 files changed, 19 insertions(+), 37 deletions(-) diff --git a/Gateways.Api/Controllers/DevicesController.cs b/Gateways.Api/Controllers/DevicesController.cs index cbaa50b..58f007e 100644 --- a/Gateways.Api/Controllers/DevicesController.cs +++ b/Gateways.Api/Controllers/DevicesController.cs @@ -24,7 +24,7 @@ public DevicesController(IDeviceService service, IMapper mapper, IConfiguration [HttpPost] public override Response Post([FromBody] DevicePostModel model) { - var count = service.Where(g => g.GatewayId == model.GatewayId).Count(); + var count = service.Query().Where(g => g.GatewayId == model.GatewayId).Count(); if (count >= maxNumberOfDevicesPerGateway) throw new BadRequestError("Maximum number of devices reached for gateway"); return base.Post(model); @@ -34,6 +34,7 @@ public override Response Post([FromBody] DevicePostModel model) public override Response Put(int id, [FromBody] DevicePutModel model) { var gatewayId = service + .Query() .Where(g => Equals(g.Id, id)) .Select(g => g.GatewayId) .FirstOrDefault(); @@ -41,7 +42,7 @@ public override Response Put(int id, [FromBody] DevicePutModel m throw new NotFoundError(); if (gatewayId != model.GatewayId) { - var count = service.Where(g => g.GatewayId == model.GatewayId).Count(); + var count = service.Query().Where(g => g.GatewayId == model.GatewayId).Count(); if (count >= maxNumberOfDevicesPerGateway) throw new BadRequestError("Maximum number of devices reached for gateway"); } diff --git a/Gateways.Business.Contracts/Contracts/IRepository.cs b/Gateways.Business.Contracts/Contracts/IRepository.cs index df9008f..8710da1 100644 --- a/Gateways.Business.Contracts/Contracts/IRepository.cs +++ b/Gateways.Business.Contracts/Contracts/IRepository.cs @@ -1,8 +1,9 @@ namespace Gateways.Business.Contracts; -public interface IRepository : IQueryable where TEntity : class +public interface IRepository where TEntity : class { IObjectContext Context { get; } + IQueryable Query(); void Add(TEntity entity); void Update(TEntity entity); void Remove(TEntity entity); diff --git a/Gateways.Business.Contracts/Services/IService.cs b/Gateways.Business.Contracts/Services/IService.cs index d064c06..62aadb0 100644 --- a/Gateways.Business.Contracts/Services/IService.cs +++ b/Gateways.Business.Contracts/Services/IService.cs @@ -1,7 +1,8 @@ namespace Gateways.Business.Contracts.Services; -public interface IService : IQueryable where TEntity : class +public interface IService where TEntity : class { + IQueryable Query(); void Add(TEntity entity); void Update(TEntity entity); void Remove(TEntity entity); diff --git a/Gateways.Business.Implementations/Services/BaseService.cs b/Gateways.Business.Implementations/Services/BaseService.cs index 6092538..ca84291 100644 --- a/Gateways.Business.Implementations/Services/BaseService.cs +++ b/Gateways.Business.Implementations/Services/BaseService.cs @@ -1,7 +1,5 @@ using Gateways.Business.Contracts; using Gateways.Business.Contracts.Services; -using System.Collections; -using System.Linq.Expressions; namespace Gateways.Business.Implementations.Services; @@ -13,17 +11,9 @@ public BaseService(IRepository repository) } protected IRepository BaseRepository { get; } - - public Type ElementType => BaseRepository.ElementType; - - public Expression Expression => BaseRepository.Expression; - - public IQueryProvider Provider => BaseRepository.Provider; - - public IEnumerator GetEnumerator() => BaseRepository.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - + + public IQueryable Query() => BaseRepository.Query(); + public void Add(TEntity entity) => BaseRepository.Add(entity); public void Update(TEntity entity) => BaseRepository.Update(entity); @@ -33,4 +23,5 @@ public BaseService(IRepository repository) public void Commit() => BaseRepository.Commit(); public Task CommitAsync() => BaseRepository.CommitAsync(); + } diff --git a/Gateways.Common/Controllers/CrudApiControllerBase.cs b/Gateways.Common/Controllers/CrudApiControllerBase.cs index b76f4c9..131f4d7 100644 --- a/Gateways.Common/Controllers/CrudApiControllerBase.cs +++ b/Gateways.Common/Controllers/CrudApiControllerBase.cs @@ -30,7 +30,7 @@ public virtual PaginatedResponse> GetAll([FromQuery] Paginatio { var skip = pagination.Page * pagination.PageSize; var take = pagination.PageSize; - var query = service.AsNoTrackingWithIdentityResolution(); + var query = service.Query().AsNoTrackingWithIdentityResolution(); if (order != null) query = order(query); var models = query.Skip(skip).Take(pagination.PageSize).ToList(); @@ -42,7 +42,7 @@ public virtual PaginatedResponse> GetAll([FromQuery] Paginatio [HttpGet("{id}")] public virtual Response Get(TKey id) { - IQueryable query = service.AsNoTrackingWithIdentityResolution(); + IQueryable query = service.Query().AsNoTrackingWithIdentityResolution(); if (includer != null) query = includer(query); var model = query.FirstOrDefault(g => Equals(g.Id, id)); @@ -63,7 +63,7 @@ public virtual Response Post([FromBody] TPost model) [HttpPut("{id}")] public virtual Response Put(TKey id, [FromBody] TPut model) { - var entity = service.FirstOrDefault(g => Equals(g.Id, id)); + var entity = service.Query().FirstOrDefault(g => Equals(g.Id, id)); if (entity == null) throw new NotFoundError(); mapper.Map(model, entity); @@ -74,7 +74,7 @@ public virtual Response Put(TKey id, [FromBody] TPut model) [HttpDelete("{id}")] public virtual Response Delete(TKey id) { - var entity = service.FirstOrDefault(g => Equals(g.Id, id)); + var entity = service.Query().FirstOrDefault(g => Equals(g.Id, id)); if (entity == null) throw new NotFoundError(); service.Remove(entity); diff --git a/Gateways.Data.Implementations/Repositories/BaseRepository.cs b/Gateways.Data.Implementations/Repositories/BaseRepository.cs index 54b8719..e3379f4 100644 --- a/Gateways.Data.Implementations/Repositories/BaseRepository.cs +++ b/Gateways.Data.Implementations/Repositories/BaseRepository.cs @@ -1,6 +1,4 @@ using Gateways.Business.Contracts; -using System.Collections; -using System.Linq.Expressions; namespace Gateways.Data.Implementations.Repositories; @@ -9,29 +7,19 @@ public class BaseRepository : IRepository where TEntity : clas public BaseRepository(IObjectContext context) { Context = context; - Expression = context.Query().Expression; - Provider = context.Query().Provider; } public IObjectContext Context { get; } - public Expression Expression { get; } - - public IQueryProvider Provider { get; } - - public Type ElementType => typeof(TEntity); + public IQueryable Query() => Context.Query(); public void Add(TEntity entity) => Context.Add(entity); - public void Commit() => Context.Commit(); - - public Task CommitAsync() => Context.CommitAsync(); - - public IEnumerator GetEnumerator() => Context.Query().GetEnumerator(); + public void Update(TEntity entity) => Context.Update(entity); public void Remove(TEntity entity) => Context.Remove(entity); - public void Update(TEntity entity) => Context.Update(entity); + public void Commit() => Context.Commit(); - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public Task CommitAsync() => Context.CommitAsync(); }