Browse Source

Add WithDetails to the repository.

pull/272/head
Halil İbrahim Kalkan 9 years ago
parent
commit
649f80e8de
  1. 4
      src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyRepository.cs
  2. 12
      src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryBase.cs
  3. 10
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs
  4. 13
      test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Repositories/Repository_Queryable_Tests.cs
  5. 23
      test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/Repository_Queryable_Tests.cs

4
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<TEntity> : IQueryable<TEntity>
public interface IReadOnlyRepository<out TEntity> : IQueryable<TEntity>
{
IQueryable<TEntity> WithDetails();
}
public interface IReadOnlyRepository<TEntity, TKey> : IReadOnlyRepository<TEntity>, IReadOnlyBasicRepository<TEntity, TKey>

12
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<TEntity> WithDetails()
{
return GetQueryable();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
@ -66,11 +71,6 @@ namespace Volo.Abp.Domain.Repositories
return query;
}
protected virtual IQueryable<TEntity> IncludeDetails(IQueryable<TEntity> queryable)
{
return queryable;
}
}
public abstract class RepositoryBase<TEntity, TKey> : RepositoryBase<TEntity>, IRepository<TEntity, TKey>
@ -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<TEntity, TKey>(id))
? WithDetails().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId<TEntity, TKey>(id))
: GetQueryable().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId<TEntity, TKey>(id));
}

10
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<TEntity> IncludeDetails(IQueryable<TEntity> queryable)
public override IQueryable<TEntity> 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<TEntity, TKey>(id))
? WithDetails().FirstOrDefault(EntityHelper.CreateEqualityExpressionForId<TEntity, TKey>(id))
: DbSet.Find(id);
}
public virtual async Task<TEntity> FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default)
{
return includeDetails
? await IncludeDetails(DbSet).FirstOrDefaultAsync(EntityHelper.CreateEqualityExpressionForId<TEntity, TKey>(id), GetCancellationToken(cancellationToken))
? await WithDetails().FirstOrDefaultAsync(EntityHelper.CreateEqualityExpressionForId<TEntity, TKey>(id), GetCancellationToken(cancellationToken))
: await DbSet.FindAsync(new object[] { id }, GetCancellationToken(cancellationToken));
}

13
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);
});
}
}
}

23
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);
});
}
}
}

Loading…
Cancel
Save