updated repository

master
Young 6 months ago
parent b521c6d60c
commit 3d64dac668

@ -46,7 +46,7 @@ public class DefaultControllerBase : ControllerBase
int totalPages,
string message = "successful")
{
var pageData = new PageData<T>(page, pageSize, totalPages, totalItems, data);
var pageData = new PageData<T>(page,totalPages, totalItems, pageSize, data);
return new MessageData<PageData<T>>(pageData, true, message);
}

@ -1,23 +1,35 @@
namespace Infrastructure;
/// <summary>
/// 分页数据
/// </summary>
/// <param name="page">当前页</param>
/// <param name="pageSize">当前页数量</param>
/// <param name="totalPages">总页数量</param>
/// <param name="totalItems">总条目数量</param>
/// <param name="data">返回数据</param>
/// <typeparam name="T">实体类型</typeparam>
public class PageData<T>(int page, int pageSize, int totalPages, long totalItems, List<T> data)
using Mapster;
namespace Infrastructure;
public class PageData<T>
{
public int Page { get; set; } = page;
public PageData()
{
}
public PageData(int pageIndex, int pageCount, long dataCount, int pageSize, List<T> data)
{
Page = pageIndex;
PageCount = pageCount;
DataCount = dataCount;
PageSize = pageSize;
Data = data;
}
public int Page { get; set; }
public int PageCount { get; set; }
public int PageSize { get; set; } = pageSize;
public long DataCount { get; set; }
public int TotalPages { get; set; } = totalPages;
public int PageSize { get; set; }
public long TotalItems { get; set; } = totalItems;
public List<T> Data { get; set; }
public List<T> Data { get; set; } = data;
public PageData<TResult> ConvertTo<TResult>()
{
var result = new PageData<TResult>(Page, PageCount, DataCount, PageSize, Data?.Adapt<List<TResult>>());
return result;
}
}

@ -4,6 +4,6 @@ namespace Infrastructure.Repository.Mongo;
public interface IIdentifiable<TKey> where TKey : IEquatable<TKey>
{
[BsonId]
TKey Id { get; set; }
[BsonId] TKey Id { get; set; }
string Name { get; set; }
}

@ -9,6 +9,8 @@ public interface IMongoRepositoryBase<TEntity, in TKey>
Task AddAsync(TEntity entity);
Task AddManyAsync(IEnumerable<TEntity> entities);
Task<TEntity?> GetAsync(TKey id);
Task<List<TEntity>?> GetListAsync();
@ -21,9 +23,11 @@ public interface IMongoRepositoryBase<TEntity, in TKey>
Task<List<TEntity>?> GetListFilterAsync(FilterDefinition<TEntity> filter);
Task UpdateAsync(TKey id, TEntity entity);
Task<TEntity> UpdateAsync(TKey id, TEntity entity);
Task<TEntity> DeleteAsync(TKey id);
Task DeleteAsync(TKey id);
Task<bool> DeleteManyAsync(Expression<Func<TEntity, bool>> predicate);
Task<PageData<TEntity>?> GetPageDataAsync(int page, int pageSize,
Expression<Func<TEntity, bool>>? filter = null,

@ -0,0 +1,37 @@
using MongoDB.Driver;
namespace Infrastructure.Repository.Mongo;
public interface IMongoServiceBase<TEntity, TKey> where TEntity : class, IIdentifiable<TKey>, new()
where TKey : IEquatable<TKey>
{
IMongoRepositoryBase<TEntity, TKey> DAL { get; set; }
Task AddAsync(TEntity entity);
Task AddManyAsync(IEnumerable<TEntity> entities);
Task<TEntity?> GetAsync(TKey id);
Task<List<TEntity>?> GetListAsync();
Task<TEntity?> GetByObjectIdAsync(string id);
Task<TEntity?> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate);
public Task<List<TEntity>?> GetListAsync(Expression<Func<TEntity, bool>> predicate);
Task<List<TEntity>?> GetListFilterAsync(FilterDefinition<TEntity> filter);
Task<TEntity> UpdateAsync(TKey id, TEntity entity);
Task<TEntity> DeleteAsync(TKey id);
Task<bool> DeleteManyAsync(Expression<Func<TEntity, bool>> predicate);
Task<PageData<TEntity>?> GetPageDataAsync(int page, int pageSize,
Expression<Func<TEntity, bool>>? filter = null,
Expression<Func<TEntity, object>>? orderBy = null,
bool ascending = false
);
}

@ -0,0 +1,8 @@
namespace Infrastructure.Repository.Mongo;
public abstract class IdentifiableBase<TKey> : IIdentifiable<TKey> where TKey : IEquatable<TKey>
{
public TKey Id { get; set; }
public string Name { get; set; }
}

@ -1,5 +1,6 @@
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using SqlSugar.Extensions;
namespace Infrastructure.Repository.Mongo;
@ -20,6 +21,11 @@ public class MongoRepositoryBase<TEntity, TKey>(IMongoDatabase database) :
await _collection.InsertOneAsync(entity);
}
public async Task AddManyAsync(IEnumerable<TEntity> entities)
{
await _collection.InsertManyAsync(entities);
}
public async Task<TEntity?> GetAsync(TKey id)
{
var filter = Builders<TEntity>.Filter.Eq(_idField, id);
@ -28,7 +34,7 @@ public class MongoRepositoryBase<TEntity, TKey>(IMongoDatabase database) :
public async Task<List<TEntity>?> GetListAsync()
{
return await _collection.Find(_ => true).ToListAsync();
return await _collection.AsQueryable().ToListAsync();
}
public async Task<TEntity?> GetByObjectIdAsync(string id)
@ -54,16 +60,23 @@ public class MongoRepositoryBase<TEntity, TKey>(IMongoDatabase database) :
return await _collection.Find(filter).ToListAsync();
}
public async Task UpdateAsync(TKey id, TEntity entity)
public async Task<TEntity> UpdateAsync(TKey id, TEntity entity)
{
var filter = Builders<TEntity>.Filter.Eq(_idField, id);
await _collection.FindOneAndReplaceAsync(filter, entity);
return await _collection.FindOneAndReplaceAsync(filter, entity);
}
public async Task DeleteAsync(TKey id)
public async Task<TEntity> DeleteAsync(TKey id)
{
var filter = Builders<TEntity>.Filter.Eq(_idField, id);
await _collection.FindOneAndDeleteAsync(filter);
return await _collection.FindOneAndDeleteAsync(filter);
}
public async Task<bool> DeleteManyAsync(Expression<Func<TEntity, bool>> predicate)
{
var filter = Builders<TEntity>.Filter.Where(predicate);
var result = await _collection.DeleteManyAsync(filter);
return result.IsAcknowledged;
}
public async Task<PageData<TEntity>?> GetPageDataAsync(int page, int pageSize,
@ -84,7 +97,7 @@ public class MongoRepositoryBase<TEntity, TKey>(IMongoDatabase database) :
var query = _collection.Find(filter is null
? Builders<TEntity>.Filter.Empty
: Builders<TEntity>.Filter.Where(filter));
var total = await query.CountDocumentsAsync();
var totalTask = query.CountDocumentsAsync();
var itemTask = query.Skip((page - 1) * pageSize).Limit(pageSize);
if (orderBy != null)
{
@ -99,7 +112,8 @@ public class MongoRepositoryBase<TEntity, TKey>(IMongoDatabase database) :
}
var items = await itemTask.ToListAsync();
var totalPages = Math.Ceiling(total.ObjToDecimal() / pageSize.ObjToDecimal()).ObjToInt();
return new PageData<TEntity>(page, pageSize, totalPages, total, items);
var total = await totalTask;
var pageCount = Math.Ceiling(total.ObjToDecimal() / pageSize.ObjToDecimal()).ObjToInt();
return new PageData<TEntity>(page, pageCount, total, pageSize, items);
}
}

@ -0,0 +1,73 @@
using MongoDB.Driver;
namespace Infrastructure.Repository.Mongo;
public abstract class MongoServiceBase<TEntity, TKey>(IMongoRepositoryBase<TEntity, TKey> repositoryBase)
: IMongoServiceBase<TEntity, TKey>
where TEntity : class, IIdentifiable<TKey>, new()
where TKey : IEquatable<TKey>
{
public IMongoRepositoryBase<TEntity, TKey> DAL { get; set; } = repositoryBase;
public async Task AddAsync(TEntity entity)
{
await DAL.AddAsync(entity);
}
public async Task AddManyAsync(IEnumerable<TEntity> entities)
{
await DAL.AddManyAsync(entities);
}
public async Task<TEntity?> GetAsync(TKey id)
{
return await DAL.GetAsync(id);
}
public async Task<List<TEntity>?> GetListAsync()
{
return await DAL.GetListAsync();
}
public async Task<TEntity?> GetByObjectIdAsync(string id)
{
return await DAL.GetByObjectIdAsync(id);
}
public async Task<TEntity?> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate)
{
return await DAL.GetFirstOrDefaultAsync(predicate);
}
public async Task<List<TEntity>?> GetListAsync(Expression<Func<TEntity, bool>> predicate)
{
return await DAL.GetListAsync(predicate);
}
public async Task<List<TEntity>?> GetListFilterAsync(FilterDefinition<TEntity> filter)
{
return await DAL.GetListFilterAsync(filter);
}
public async Task<TEntity> UpdateAsync(TKey id, TEntity entity)
{
return await DAL.UpdateAsync(id, entity);
}
public async Task<TEntity> DeleteAsync(TKey id)
{
return await DAL.DeleteAsync(id);
}
public async Task<bool> DeleteManyAsync(Expression<Func<TEntity, bool>> predicate)
{
return await DAL.DeleteManyAsync(predicate);
}
public async Task<PageData<TEntity>?> GetPageDataAsync(int page, int pageSize,
Expression<Func<TEntity, bool>>? filter = null, Expression<Func<TEntity, object>>? orderBy = null,
bool ascending = false)
{
return await DAL.GetPageDataAsync(page, pageSize, filter, orderBy, ascending);
}
}
Loading…
Cancel
Save