mirror of https://github.com/abpframework/abp.git
6 changed files with 290 additions and 1 deletions
@ -0,0 +1,77 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Linq.Expressions; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Domain.Entities; |
||||
|
|
||||
|
namespace Volo.Abp.Domain.Repositories |
||||
|
{ |
||||
|
public interface IQueryableRepository<TEntity, TPrimaryKey> : IRepository<TEntity, TPrimaryKey> |
||||
|
where TEntity : class, IEntity<TPrimaryKey> |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Used to get a IQueryable that is used to retrieve entities from entire table.
|
||||
|
/// </summary>
|
||||
|
/// <returns>IQueryable to be used to select entities from database</returns>
|
||||
|
IQueryable<TEntity> GetAll(); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Used to get all entities based on given <paramref name="predicate"/>.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">A condition to filter entities</param>
|
||||
|
/// <returns>List of all entities</returns>
|
||||
|
List<TEntity> GetAllList(Expression<Func<TEntity, bool>> predicate); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Used to get all entities based on given <paramref name="predicate"/>.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">A condition to filter entities</param>
|
||||
|
/// <returns>List of all entities</returns>
|
||||
|
Task<List<TEntity>> GetAllListAsync(Expression<Func<TEntity, bool>> predicate); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets an entity with given given predicate or null if not found.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">Predicate to filter entities</param>
|
||||
|
TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets an entity with given given predicate or null if not found.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">Predicate to filter entities</param>
|
||||
|
Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Deletes many entities by function.
|
||||
|
/// Notice that: All entities fits to given predicate are retrieved and deleted.
|
||||
|
/// This may cause major performance problems if there are too many entities with
|
||||
|
/// given predicate.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">A condition to filter entities</param>
|
||||
|
void Delete(Expression<Func<TEntity, bool>> predicate); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Deletes many entities by function.
|
||||
|
/// Notice that: All entities fits to given predicate are retrieved and deleted.
|
||||
|
/// This may cause major performance problems if there are too many entities with
|
||||
|
/// given predicate.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">A condition to filter entities</param>
|
||||
|
Task DeleteAsync(Expression<Func<TEntity, bool>> predicate); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets count of all entities in this repository based on given <paramref name="predicate"/>.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">A method to filter count</param>
|
||||
|
/// <returns>Count of entities</returns>
|
||||
|
int Count(Expression<Func<TEntity, bool>> predicate); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets count of all entities in this repository based on given <paramref name="predicate"/>.
|
||||
|
/// </summary>
|
||||
|
/// <param name="predicate">A method to filter count</param>
|
||||
|
/// <returns>Count of entities</returns>
|
||||
|
Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,129 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Domain.Entities; |
||||
|
|
||||
|
namespace Volo.Abp.Domain.Repositories |
||||
|
{ |
||||
|
//TODO: Didn't get all members from ABP 1.x
|
||||
|
|
||||
|
public interface IRepository<TEntity, TPrimaryKey> : IRepositoryMarker where TEntity : class, IEntity<TPrimaryKey> |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Used to get all entities.
|
||||
|
/// </summary>
|
||||
|
/// <returns>List of all entities</returns>
|
||||
|
List<TEntity> GetAllList(); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Used to get all entities.
|
||||
|
/// </summary>
|
||||
|
/// <returns>List of all entities</returns>
|
||||
|
Task<List<TEntity>> GetAllListAsync(); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets an entity with given primary key.
|
||||
|
/// </summary>
|
||||
|
/// <param name="id">Primary key of the entity to get</param>
|
||||
|
/// <returns>Entity</returns>
|
||||
|
TEntity Get(TPrimaryKey id); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets an entity with given primary key.
|
||||
|
/// </summary>
|
||||
|
/// <param name="id">Primary key of the entity to get</param>
|
||||
|
/// <returns>Entity</returns>
|
||||
|
Task<TEntity> GetAsync(TPrimaryKey id); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets an entity with given primary key or null if not found.
|
||||
|
/// </summary>
|
||||
|
/// <param name="id">Primary key of the entity to get</param>
|
||||
|
/// <returns>Entity or null</returns>
|
||||
|
TEntity FirstOrDefault(TPrimaryKey id); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets an entity with given primary key or null if not found.
|
||||
|
/// </summary>
|
||||
|
/// <param name="id">Primary key of the entity to get</param>
|
||||
|
/// <returns>Entity or null</returns>
|
||||
|
Task<TEntity> FirstOrDefaultAsync(TPrimaryKey id); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Inserts a new entity.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Inserted entity</param>
|
||||
|
TEntity Insert(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Inserts a new entity.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Inserted entity</param>
|
||||
|
Task<TEntity> InsertAsync(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Inserts a new entity and gets it's Id.
|
||||
|
/// It may require to save current unit of work
|
||||
|
/// to be able to retrieve id.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Entity</param>
|
||||
|
/// <returns>Id of the entity</returns>
|
||||
|
TPrimaryKey InsertAndGetId(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Inserts a new entity and gets it's Id.
|
||||
|
/// It may require to save current unit of work
|
||||
|
/// to be able to retrieve id.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Entity</param>
|
||||
|
/// <returns>Id of the entity</returns>
|
||||
|
Task<TPrimaryKey> InsertAndGetIdAsync(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Updates an existing entity.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Entity</param>
|
||||
|
TEntity Update(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Updates an existing entity.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Entity</param>
|
||||
|
Task<TEntity> UpdateAsync(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Deletes an entity.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Entity to be deleted</param>
|
||||
|
void Delete(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Deletes an entity.
|
||||
|
/// </summary>
|
||||
|
/// <param name="entity">Entity to be deleted</param>
|
||||
|
Task DeleteAsync(TEntity entity); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Deletes an entity by primary key.
|
||||
|
/// </summary>
|
||||
|
/// <param name="id">Primary key of the entity</param>
|
||||
|
void Delete(TPrimaryKey id); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Deletes an entity by primary key.
|
||||
|
/// </summary>
|
||||
|
/// <param name="id">Primary key of the entity</param>
|
||||
|
Task DeleteAsync(TPrimaryKey id); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets count of all entities in this repository.
|
||||
|
/// </summary>
|
||||
|
/// <returns>Count of entities</returns>
|
||||
|
int Count(); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Gets count of all entities in this repository.
|
||||
|
/// </summary>
|
||||
|
/// <returns>Count of entities</returns>
|
||||
|
Task<int> CountAsync(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
namespace Volo.Abp.Domain.Repositories |
||||
|
{ |
||||
|
public interface IRepositoryMarker |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
using System; |
||||
|
using System.Reflection; |
||||
|
using System.Threading.Tasks; |
||||
|
using Nito.AsyncEx; |
||||
|
|
||||
|
namespace Volo.Abp.Threading |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Provides some helper methods to work with async methods.
|
||||
|
/// </summary>
|
||||
|
public static class AsyncHelper |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Checks if given method is an async method.
|
||||
|
/// </summary>
|
||||
|
/// <param name="method">A method to check</param>
|
||||
|
public static bool IsAsyncMethod(MethodInfo method) |
||||
|
{ |
||||
|
return method.ReturnType == typeof(Task) || |
||||
|
(method.ReturnType.GetTypeInfo().IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Runs a async method synchronously.
|
||||
|
/// </summary>
|
||||
|
/// <param name="func">A function that returns a result</param>
|
||||
|
/// <typeparam name="TResult">Result type</typeparam>
|
||||
|
/// <returns>Result of the async operation</returns>
|
||||
|
public static TResult RunSync<TResult>(Func<Task<TResult>> func) |
||||
|
{ |
||||
|
return AsyncContext.Run(func); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Runs a async method synchronously.
|
||||
|
/// </summary>
|
||||
|
/// <param name="action">An async action</param>
|
||||
|
public static void RunSync(Func<Task> action) |
||||
|
{ |
||||
|
AsyncContext.Run(action); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Shouldly; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.Threading |
||||
|
{ |
||||
|
public class AsyncHelper_Tests |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void RunSync_Test_Without_Return_Value() |
||||
|
{ |
||||
|
AsyncHelper.RunSync(MyTaskWithoutReturnValue); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void RunSync_Test_With_Return_Value() |
||||
|
{ |
||||
|
AsyncHelper.RunSync(() => MyTaskWithReturnValue(42)).ShouldBe(42); |
||||
|
} |
||||
|
|
||||
|
private static async Task MyTaskWithoutReturnValue() |
||||
|
{ |
||||
|
await Task.Delay(1); |
||||
|
} |
||||
|
|
||||
|
private static async Task<int> MyTaskWithReturnValue(int aNumber) |
||||
|
{ |
||||
|
await Task.Delay(1); |
||||
|
return aNumber; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue