From 649f80e8de2231f6e3d6ad645697832d76cad905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 14 Apr 2018 15:26:38 +0300 Subject: [PATCH] Add WithDetails to the repository. --- .../Repositories/IReadOnlyRepository.cs | 4 ++-- .../Abp/Domain/Repositories/RepositoryBase.cs | 12 +++++----- .../EntityFrameworkCore/EfCoreRepository.cs | 10 ++++---- .../Repository_Queryable_Tests.cs | 13 +++++++++++ .../Testing/Repository_Queryable_Tests.cs | 23 ++++++++++++++++++- 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyRepository.cs b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyRepository.cs index 69189b9c8e..dbabd1b970 100644 --- a/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyRepository.cs +++ b/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyRepository.cs @@ -3,9 +3,9 @@ using Volo.Abp.Domain.Entities; namespace Volo.Abp.Domain.Repositories { - public interface IReadOnlyRepository : IQueryable + public interface IReadOnlyRepository : IQueryable { - + IQueryable WithDetails(); } public interface IReadOnlyRepository : IReadOnlyRepository, IReadOnlyBasicRepository 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 6d2d1d92df..fe23d3b582 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 @@ -24,6 +24,11 @@ namespace Volo.Abp.Domain.Repositories public virtual IQueryProvider Provider => GetQueryable().Provider; + public virtual IQueryable WithDetails() + { + return GetQueryable(); + } + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); @@ -66,11 +71,6 @@ namespace Volo.Abp.Domain.Repositories return query; } - - protected virtual IQueryable IncludeDetails(IQueryable queryable) - { - return queryable; - } } public abstract class RepositoryBase : RepositoryBase, IRepository @@ -79,7 +79,7 @@ namespace Volo.Abp.Domain.Repositories public virtual TEntity Find(TKey id, bool includeDetails = true) { return includeDetails - ? IncludeDetails(GetQueryable()).FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)) + ? WithDetails().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)) : GetQueryable().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)); } 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 edcdb5570d..dc4ab42088 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 @@ -159,14 +159,14 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore await DbContext.Entry(entity).Reference(propertyExpression).LoadAsync(GetCancellationToken(cancellationToken)); } - protected override IQueryable IncludeDetails(IQueryable queryable) + public override IQueryable WithDetails() { if (EntityOptions.IncludeDetailsFunc == null) { - return base.IncludeDetails(queryable); + return base.WithDetails(); } - return EntityOptions.IncludeDetailsFunc(queryable); + return EntityOptions.IncludeDetailsFunc(GetQueryable()); } } @@ -210,14 +210,14 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore public virtual TEntity Find(TKey id, bool includeDetails = true) { return includeDetails - ? IncludeDetails(DbSet).FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)) + ? WithDetails().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId(id)) : DbSet.Find(id); } public virtual async Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default) { return includeDetails - ? await IncludeDetails(DbSet).FirstOrDefaultAsync(EntityHelper.CreateEqualityExpressionForId(id), GetCancellationToken(cancellationToken)) + ? await WithDetails().FirstOrDefaultAsync(EntityHelper.CreateEqualityExpressionForId(id), GetCancellationToken(cancellationToken)) : await DbSet.FindAsync(new object[] { id }, GetCancellationToken(cancellationToken)); } diff --git a/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/Repository_Queryable_Tests.cs b/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/Repository_Queryable_Tests.cs index db8dea74f2..bd4859784a 100644 --- a/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/Repository_Queryable_Tests.cs +++ b/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/Repository_Queryable_Tests.cs @@ -1,9 +1,11 @@ using System; using System.Linq; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Domain.Repositories; using Volo.Abp.EntityFrameworkCore.TestApp.SecondContext; +using Volo.Abp.TestApp; using Volo.Abp.TestApp.Testing; using Xunit; @@ -37,5 +39,16 @@ namespace Volo.Abp.EntityFrameworkCore.Repositories _phoneInSecondDbContextRepository.Any().ShouldBeTrue(); }); } + + [Fact] + public void EfCore_Include_Extension() + { + WithUnitOfWork(() => + { + var person = PersonRepository.Include(p => p.Phones).Single(p => p.Id == TestDataBuilder.UserDouglasId); + person.Name.ShouldBe("Douglas"); + person.Phones.Count.ShouldBe(2); + }); + } } } diff --git a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Repository_Queryable_Tests.cs b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Repository_Queryable_Tests.cs index 2aabb4c475..da341d4885 100644 --- a/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Repository_Queryable_Tests.cs +++ b/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Repository_Queryable_Tests.cs @@ -20,12 +20,33 @@ namespace Volo.Abp.TestApp.Testing } [Fact] - public void GetPersonList() + public void Any() { WithUnitOfWork(() => { PersonRepository.Any().ShouldBeTrue(); }); } + + [Fact] + public void Single() + { + WithUnitOfWork(() => + { + var person = PersonRepository.Single(p => p.Id == TestDataBuilder.UserDouglasId); + person.Name.ShouldBe("Douglas"); + }); + } + + [Fact] + public void WithDetails() + { + WithUnitOfWork(() => + { + var person = PersonRepository.WithDetails().Single(p => p.Id == TestDataBuilder.UserDouglasId); + person.Name.ShouldBe("Douglas"); + person.Phones.Count.ShouldBe(2); + }); + } } }