diff --git a/src/AbpDesk/AbpDesk.Application/AbpDesk/Tickets/TicketAppService.cs b/src/AbpDesk/AbpDesk.Application/AbpDesk/Tickets/TicketAppService.cs index 3b516576a0..8c1eaf8b06 100644 --- a/src/AbpDesk/AbpDesk.Application/AbpDesk/Tickets/TicketAppService.cs +++ b/src/AbpDesk/AbpDesk.Application/AbpDesk/Tickets/TicketAppService.cs @@ -17,7 +17,7 @@ namespace AbpDesk.Tickets public ListResultDto GetAll() { var tickets = _ticketRepository - .GetAllList() + .GetList() .Select(t => new TicketDto { Id = t.Id, Title = t.Title, Body = t.Body }) .ToList(); diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Repositories/EntityFrameworkCore/EfCoreRepository.cs index 4b42e628b8..4ddf2a0c18 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Volo.Abp.Domain.Entities; @@ -8,9 +10,9 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.Repositories.EntityFrameworkCore { - //TODO: Override async versions + //TODO: Override async versions and others - public class EfCoreRepository : RepositoryBase + public class EfCoreRepository : QueryableRepositoryBase where TDbContext : AbpDbContext where TEntity : class, IEntity { @@ -23,19 +25,19 @@ namespace Volo.Abp.Repositories.EntityFrameworkCore DbContext = dbContext; } - public override List GetAllList() + public override IQueryable GetQueryable() { - return GetQueryable().ToList(); + return DbSet; } - public override Task> GetAllListAsync() + public override Task> GetListAsync() { return GetQueryable().ToListAsync(); } - public override TEntity Get(TPrimaryKey id) + public override async Task GetAsync(TPrimaryKey id) { - var entity = FirstOrDefault(id); + var entity = await FirstOrDefaultAsync(id); if (entity == null) { throw new EntityNotFoundException(typeof(TEntity), id); @@ -49,40 +51,53 @@ namespace Volo.Abp.Repositories.EntityFrameworkCore return DbSet.Find(id); } + public override Task FirstOrDefaultAsync(TPrimaryKey id) + { + return DbSet.FindAsync(id); + } + + public override Task FirstOrDefaultAsync(Expression> predicate) + { + return GetQueryable().FirstOrDefaultAsync(predicate); + } + public override TEntity Insert(TEntity entity) { return DbSet.Add(entity).Entity; } - public override TEntity Update(TEntity entity) + public override TPrimaryKey InsertAndGetId(TEntity entity) { - return DbSet.Update(entity).Entity; + var insertedEntity = Insert(entity); + DbContext.SaveChanges(); + return insertedEntity.Id; } - public override void Delete(TEntity entity) + public override async Task InsertAndGetIdAsync(TEntity entity) { - DbSet.Remove(entity); + var insertedEntity = await InsertAsync(entity); + await DbContext.SaveChangesAsync(); + return insertedEntity.Id; } - public override void Delete(TPrimaryKey id) + public override TEntity Update(TEntity entity) { - var entity = FirstOrDefault(id); - if (entity == null) - { - return; - } + return DbSet.Update(entity).Entity; + } - Delete(entity); + public override void Delete(TEntity entity) + { + DbSet.Remove(entity); } - public override int Count() + public override Task CountAsync() { - return GetQueryable().Count(); + return DbSet.CountAsync(); } - protected virtual IQueryable GetQueryable() + public override Task CountAsync(Expression> predicate) { - return DbSet; + return DbSet.CountAsync(predicate); } } } diff --git a/src/Volo.Abp/Volo/Abp/Domain/Repositories/IQueryableRepository.cs b/src/Volo.Abp/Volo/Abp/Domain/Repositories/IQueryableRepository.cs index 4a802d5505..5e20db10bb 100644 --- a/src/Volo.Abp/Volo/Abp/Domain/Repositories/IQueryableRepository.cs +++ b/src/Volo.Abp/Volo/Abp/Domain/Repositories/IQueryableRepository.cs @@ -14,21 +14,21 @@ namespace Volo.Abp.Domain.Repositories /// Used to get a IQueryable that is used to retrieve entities from entire table. /// /// IQueryable to be used to select entities from database - IQueryable GetAll(); + IQueryable GetQueryable(); /// /// Used to get all entities based on given . /// /// A condition to filter entities /// List of all entities - List GetAllList(Expression> predicate); + List GetList(Expression> predicate); /// /// Used to get all entities based on given . /// /// A condition to filter entities /// List of all entities - Task> GetAllListAsync(Expression> predicate); + Task> GetListAsync(Expression> predicate); /// /// Gets an entity with given given predicate or null if not found. diff --git a/src/Volo.Abp/Volo/Abp/Domain/Repositories/IRepository.cs b/src/Volo.Abp/Volo/Abp/Domain/Repositories/IRepository.cs index 8d2b31876e..85f1fbda6b 100644 --- a/src/Volo.Abp/Volo/Abp/Domain/Repositories/IRepository.cs +++ b/src/Volo.Abp/Volo/Abp/Domain/Repositories/IRepository.cs @@ -14,13 +14,13 @@ namespace Volo.Abp.Domain.Repositories /// Used to get all entities. /// /// List of all entities - List GetAllList(); + List GetList(); /// /// Used to get all entities. /// /// List of all entities - Task> GetAllListAsync(); + Task> GetListAsync(); /// /// Gets an entity with given primary key. diff --git a/src/Volo.Abp/Volo/Abp/Domain/Repositories/QueryableRepositoryBase.cs b/src/Volo.Abp/Volo/Abp/Domain/Repositories/QueryableRepositoryBase.cs index f490606b49..a337602e5e 100644 --- a/src/Volo.Abp/Volo/Abp/Domain/Repositories/QueryableRepositoryBase.cs +++ b/src/Volo.Abp/Volo/Abp/Domain/Repositories/QueryableRepositoryBase.cs @@ -10,23 +10,45 @@ namespace Volo.Abp.Domain.Repositories public abstract class QueryableRepositoryBase : RepositoryBase, IQueryableRepository where TEntity : class, IEntity { - public abstract IQueryable GetAll(); + public abstract IQueryable GetQueryable(); - public abstract List GetAllList(Expression> predicate); + public override List GetList() + { + return GetQueryable().ToList(); + } - public virtual Task> GetAllListAsync(Expression> predicate) + public virtual List GetList(Expression> predicate) { - return Task.FromResult(GetAllList(predicate)); + return GetQueryable().Where(predicate).ToList(); } - public abstract TEntity FirstOrDefault(Expression> predicate); + public virtual Task> GetListAsync(Expression> predicate) + { + return Task.FromResult(GetList(predicate)); + } + + public override TEntity FirstOrDefault(TPrimaryKey id) + { + return FirstOrDefault(CreateEqualityExpressionForId(id)); + } + + public virtual TEntity FirstOrDefault(Expression> predicate) + { + return GetQueryable().FirstOrDefault(predicate); + } public virtual Task FirstOrDefaultAsync(Expression> predicate) { return Task.FromResult(FirstOrDefault(predicate)); } - public abstract void Delete(Expression> predicate); + public virtual void Delete(Expression> predicate) + { + foreach (var entity in GetQueryable().Where(predicate).ToList()) + { + Delete(entity); + } + } public virtual Task DeleteAsync(Expression> predicate) { @@ -34,7 +56,15 @@ namespace Volo.Abp.Domain.Repositories return Task.CompletedTask; } - public abstract int Count(Expression> predicate); + public override int Count() + { + return GetQueryable().Count(); + } + + public virtual int Count(Expression> predicate) + { + return GetQueryable().Count(predicate); + } public virtual Task CountAsync(Expression> predicate) { diff --git a/src/Volo.Abp/Volo/Abp/Domain/Repositories/RepositoryBase.cs b/src/Volo.Abp/Volo/Abp/Domain/Repositories/RepositoryBase.cs index 1d78d64444..af24a4fc0a 100644 --- a/src/Volo.Abp/Volo/Abp/Domain/Repositories/RepositoryBase.cs +++ b/src/Volo.Abp/Volo/Abp/Domain/Repositories/RepositoryBase.cs @@ -9,14 +9,23 @@ namespace Volo.Abp.Domain.Repositories public abstract class RepositoryBase : IRepository where TEntity : class, IEntity { - public abstract List GetAllList(); + public abstract List GetList(); - public virtual Task> GetAllListAsync() + public virtual Task> GetListAsync() { - return Task.FromResult(GetAllList()); + return Task.FromResult(GetList()); } - public abstract TEntity Get(TPrimaryKey id); + public virtual TEntity Get(TPrimaryKey id) + { + var entity = FirstOrDefault(id); + if (entity == null) + { + throw new EntityNotFoundException(typeof(TEntity), id); + } + + return entity; + } public virtual Task GetAsync(TPrimaryKey id) { @@ -62,7 +71,16 @@ namespace Volo.Abp.Domain.Repositories return Task.CompletedTask; } - public abstract void Delete(TPrimaryKey id); + public virtual void Delete(TPrimaryKey id) + { + var entity = FirstOrDefault(id); + if (entity == null) + { + return; + } + + Delete(entity); + } public virtual Task DeleteAsync(TPrimaryKey id) { diff --git a/src/Volo.Abp/project.json b/src/Volo.Abp/project.json index 3d3d725d50..7da01df4ed 100644 --- a/src/Volo.Abp/project.json +++ b/src/Volo.Abp/project.json @@ -8,7 +8,8 @@ "Volo.ExtensionMethods": "1.0.0-*", "Newtonsoft.Json": "9.0.1", "Nito.AsyncEx.Context": "1.1.0", - "System.Runtime.Loader": "4.3.0" + "System.Runtime.Loader": "4.3.0", + "System.Linq.Queryable": "4.3.0" }, "frameworks": {