diff --git a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs index a23d3cb011..2af9307f5b 100644 --- a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs +++ b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs @@ -46,9 +46,9 @@ namespace Volo.Abp.Domain.Repositories public abstract class BasicRepositoryBase : BasicRepositoryBase, IBasicRepository where TEntity : class, IEntity { - public virtual TEntity Get(TKey id) + public virtual TEntity Get(TKey id, bool includeDetails = true) { - var entity = Find(id); + var entity = Find(id, includeDetails); if (entity == null) { @@ -58,16 +58,16 @@ namespace Volo.Abp.Domain.Repositories return entity; } - public virtual Task GetAsync(TKey id, CancellationToken cancellationToken = default) + public virtual Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return Task.FromResult(Get(id)); + return Task.FromResult(Get(id, includeDetails)); } - public abstract TEntity Find(TKey id); + public abstract TEntity Find(TKey id, bool includeDetails = true); - public virtual Task FindAsync(TKey id, CancellationToken cancellationToken = default) + public virtual Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return Task.FromResult(Find(id)); + return Task.FromResult(Find(id, includeDetails)); } public virtual void Delete(TKey id, bool autoSave = false) diff --git a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs index e876d3315e..0274960917 100644 --- a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs +++ b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs @@ -13,34 +13,38 @@ namespace Volo.Abp.Domain.Repositories /// Throws if can not find an entity with given id. /// /// Primary key of the entity to get + /// Set true to include all children of this entity /// Entity [NotNull] - TEntity Get(TKey id); + TEntity Get(TKey id, bool includeDetails = true); /// /// Gets an entity with given primary key. /// Throws if can not find an entity with given id. /// /// Primary key of the entity to get + /// Set true to include all children of this entity /// A to observe while waiting for the task to complete. /// Entity [NotNull] - Task GetAsync(TKey id, CancellationToken cancellationToken = default); + Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); /// /// Gets an entity with given primary key or null if not found. /// /// Primary key of the entity to get + /// Set true to include all children of this entity /// Entity or null [CanBeNull] - TEntity Find(TKey id); + TEntity Find(TKey id, bool includeDetails = true); /// /// Gets an entity with given primary key or null if not found. /// /// Primary key of the entity to get + /// Set true to include all children of this entity /// A to observe while waiting for the task to complete. /// Entity or null - Task FindAsync(TKey id, CancellationToken cancellationToken = default); + Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); } } diff --git a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs index 8c8bad3219..6d2d1d92df 100644 --- a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs +++ b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs @@ -40,13 +40,13 @@ namespace Volo.Abp.Domain.Repositories { foreach (var entity in GetQueryable().Where(predicate).ToList()) { - Delete(entity); + Delete(entity, autoSave); } } public virtual Task DeleteAsync(Expression> predicate, bool autoSave = false, CancellationToken cancellationToken = default) { - Delete(predicate); + Delete(predicate, autoSave); return Task.CompletedTask; } @@ -66,19 +66,26 @@ namespace Volo.Abp.Domain.Repositories return query; } + + protected virtual IQueryable IncludeDetails(IQueryable queryable) + { + return queryable; + } } public abstract class RepositoryBase : RepositoryBase, IRepository where TEntity : class, IEntity { - public virtual TEntity Find(TKey id) + public virtual TEntity Find(TKey id, bool includeDetails = true) { - return GetQueryable().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)); + return includeDetails + ? IncludeDetails(GetQueryable()).FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)) + : GetQueryable().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)); } - public virtual TEntity Get(TKey id) + public virtual TEntity Get(TKey id, bool includeDetails = true) { - var entity = Find(id); + var entity = Find(id, includeDetails); if (entity == null) { @@ -88,30 +95,30 @@ namespace Volo.Abp.Domain.Repositories return entity; } - public virtual Task GetAsync(TKey id, CancellationToken cancellationToken = default) + public virtual Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return Task.FromResult(Get(id)); + return Task.FromResult(Get(id, includeDetails)); } - public virtual Task FindAsync(TKey id, CancellationToken cancellationToken = default) + public virtual Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return Task.FromResult(Find(id)); + return Task.FromResult(Find(id, includeDetails)); } public virtual void Delete(TKey id, bool autoSave = false) { - var entity = Find(id); + var entity = Find(id, includeDetails: false); if (entity == null) { return; } - Delete(entity); + Delete(entity, autoSave); } public virtual Task DeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default) { - Delete(id); + Delete(id, autoSave); return Task.CompletedTask; } } diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index d45355e90c..d7d8c375c0 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -160,9 +160,9 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore } - public virtual TEntity Get(TKey id) + public virtual TEntity Get(TKey id, bool includeDetails = true) { - var entity = Find(id); + var entity = Find(id, includeDetails); if (entity == null) { @@ -172,9 +172,9 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore return entity; } - public virtual async Task GetAsync(TKey id, CancellationToken cancellationToken = default) + public virtual async Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - var entity = await FindAsync(id, GetCancellationToken(cancellationToken)); + var entity = await FindAsync(id, includeDetails, GetCancellationToken(cancellationToken)); if (entity == null) { @@ -184,19 +184,23 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore return entity; } - public virtual TEntity Find(TKey id) + public virtual TEntity Find(TKey id, bool includeDetails = true) { - return DbSet.Find(id); + return includeDetails + ? IncludeDetails(DbSet).FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)) + : DbSet.Find(id); } - public virtual async Task FindAsync(TKey id, CancellationToken cancellationToken = default) + public virtual async Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return await DbSet.FindAsync(new object[] { id }, GetCancellationToken(cancellationToken)); + return includeDetails + ? await IncludeDetails(DbSet).FirstOrDefaultAsync(EntityHelper.CreateEqualityExpressionForId(id), GetCancellationToken(cancellationToken)) + : await DbSet.FindAsync(new object[] { id }, GetCancellationToken(cancellationToken)); } public virtual void Delete(TKey id, bool autoSave = false) { - var entity = Find(id); + var entity = Find(id, includeDetails: false); if (entity == null) { return; @@ -207,7 +211,7 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore public virtual async Task DeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default) { - var entity = await FindAsync(id, cancellationToken); + var entity = await FindAsync(id, includeDetails: false, cancellationToken: cancellationToken); if (entity == null) { return; diff --git a/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs index 0ca1f7d2b6..62f6056088 100644 --- a/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs +++ b/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs @@ -73,14 +73,14 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb } } - public virtual TEntity Find(TKey id) + public virtual TEntity Find(TKey id, bool includeDetails = true) { return GetQueryable().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)); } - public virtual TEntity Get(TKey id) + public virtual TEntity Get(TKey id, bool includeDetails = true) { - var entity = Find(id); + var entity = Find(id, includeDetails); if (entity == null) { @@ -90,14 +90,14 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb return entity; } - public virtual Task GetAsync(TKey id, CancellationToken cancellationToken = default) + public virtual Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return Task.FromResult(Get(id)); + return Task.FromResult(Get(id, includeDetails)); } - public virtual Task FindAsync(TKey id, CancellationToken cancellationToken = default) + public virtual Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return Task.FromResult(Find(id)); + return Task.FromResult(Find(id, includeDetails)); } public virtual void Delete(TKey id, bool autoSave = false) diff --git a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index f4716bf7e6..2385ab150c 100644 --- a/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -99,9 +99,9 @@ namespace Volo.Abp.Domain.Repositories.MongoDB } - public virtual TEntity Get(TKey id) + public virtual TEntity Get(TKey id, bool includeDetails = true) { - var entity = Find(id); + var entity = Find(id, includeDetails); if (entity == null) { @@ -111,9 +111,9 @@ namespace Volo.Abp.Domain.Repositories.MongoDB return entity; } - public virtual async Task GetAsync(TKey id, CancellationToken cancellationToken = default) + public virtual async Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { - var entity = await FindAsync(id, cancellationToken); + var entity = await FindAsync(id, includeDetails, cancellationToken); if (entity == null) { @@ -123,12 +123,12 @@ namespace Volo.Abp.Domain.Repositories.MongoDB return entity; } - public virtual async Task FindAsync(TKey id, CancellationToken cancellationToken = default) + public virtual async Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { return await Collection.Find(CreateEntityFilter(id, true)).FirstOrDefaultAsync(cancellationToken); } - public virtual TEntity Find(TKey id) + public virtual TEntity Find(TKey id, bool includeDetails = true) { return Collection.Find(CreateEntityFilter(id, true)).FirstOrDefault(); } diff --git a/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs b/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs index 2c5f278eb9..662ae579f7 100644 --- a/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs +++ b/test/Volo.Abp.Ddd.Tests/Volo/Abp/Domain/Repositories/RepositoryRegistration_Tests.cs @@ -259,22 +259,22 @@ namespace Volo.Abp.Domain.Repositories public class MyTestDefaultRepository : MyTestDefaultRepository, IRepository where TEntity : class, IEntity { - public TEntity Get(TKey id) + public TEntity Get(TKey id, bool includeDetails = true) { throw new NotImplementedException(); } - public Task GetAsync(TKey id, CancellationToken cancellationToken = default) + public Task GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } - public TEntity Find(TKey id) + public TEntity Find(TKey id, bool includeDetails = true) { throw new NotImplementedException(); } - public Task FindAsync(TKey id, CancellationToken cancellationToken = default) + public Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { throw new NotImplementedException(); }