track/src/SJZY.Track.Repository/Repositories/DemoRepository.cs
2024-03-01 15:07:40 +08:00

208 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Transactions;
using SJZY.Track.Domain.Aggregates.DemoAggregate;
using SJZY.Track.Domain.Dtos.Demo;
namespace SJZY.Track.Repository.Repositories;
public class DemoRepository : BasicRepository<DemoEntity>, IDemoRepository, IScopedDependency
{
/*
一般情况下常规的增删改方法不需要自己实现,只需要按照 BasicRepository 中的格式原封不动的暴露出去即可,
比如这里接口 只声明了 UpdateAsync 和 InsertReturnIdentityAsync 接口的定义,但是这两个方法的实现我们不用写,直接交给父类实现即可
*/
#region 根据主键获取单条数据
/// <summary>
/// 根据主键获取单条数据
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Task<DemoEntity> GetById1(int id)
{
/*
//以下两种方法都不会因为没找到数据而抛异常
var model1 = base.GetFirst(m => m.Id == 0);
var model = base.GetSingle(m => m.Id == 0);
//同样的写法在linq下,如果不加 OrDefault 一定会报错
var model = base.GetList().Single(m => m.Id == 0);
var model1 = base.GetList().First(m => m.Id == 0);
*/
return base.GetSingleAsync(it => it.Id == id);
}
#endregion
#region 分页获取
/// <summary>
/// 分页获取
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<UnifyPageResultDto<DemoEntity>> GetListByPage(int pageSize, int pageindex, string name)
{
var list = await AsQueryable()
.WhereIF(!string.IsNullOrEmpty(name), a => a.Name.Contains(name))
.ToPagedListAsync(pageindex, pageSize);
return list;
}
#endregion
#region 参数为实体
/// <summary>
/// 参数很多的时候,定义模型接受参数
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public async Task<List<DemoEntity>> InputToValueObject(DemoValueObject obj)
{
var list = await AsQueryable().ToListAsync();
return list;
}
#endregion
#region 执行原生sql语句
/// <summary>
/// 执行原生sql语句
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public async Task<UnifyPageResultDto<DemoValueObject>> OriginalSql(DemoValueObject obj)
{
var parameters = new List<SugarParameter>();
var sql = @$"
select
a.id,
a.Name,
a.Age,
a.Description
from t_demo a
where 1=1
{" and a.Name like @Name ".WhereIF(!string.IsNullOrEmpty(obj.Name), obj.Name, ref parameters)}
order by a.id desc ";
var list = await Context.SqlQueryable<DemoValueObject>(sql)
.AddParameters(parameters)
.ToPagedListAsync(obj.PageIndex, obj.PageSize);
return list;
}
#endregion
#region 简单事务
public async Task Transaction()
{
using (var ts = new TransactionScope())
{
await base.InsertAsync(new DemoEntity { Name = "1111" });
await base.InsertAsync(new DemoEntity { Name = "222" });
await base.InsertAsync(new DemoEntity { Name = "3333" });
//throw new BusinessException("E05632","手动抛异常");
await base.InsertAsync(new DemoEntity { Name = "4444" });
ts.Complete();
}
}
#endregion
#region 夸方法事务
public async Task MultipleMethodTrans1()
{
await base.InsertAsync(new DemoEntity { Name = "---" });
await base.InsertAsync(new DemoEntity { Name = "+++" });
}
public async Task MultipleMethodTrans2()
{
//throw new BusinessException(message: "手动抛出异常");
await base.InsertAsync(new DemoEntity { Name = "xxx" });
}
#endregion
#region 事务嵌套
public async Task InternalTrans()
{
using (var ts = new TransactionScope())
{
await Transaction();
await MultipleMethodTrans1();
//throw new BusinessException(message: "手动抛出异常");
await base.InsertAsync(new DemoEntity { Name = "xxx" });
ts.Complete();
}
}
#endregion
#region 局部更新
public async Task UpdatePartColumns(DemoEntity entity)
{
Context.Updateable(entity).UpdateColumns(m => new { m.Description, m.Name }).ExecuteCommand();
// UPDATE `test` SET `Name`= 'string',`Description`= 'string' WHERE `id`= 5
Context.Updateable(entity).IgnoreColumns(m => new { m.CreateUserId, m.Age }).ExecuteCommand();
// UPDATE `test` SET`IsDeleted`= 0,`Name`= 'string',`Description`= 'string',`EnabledMark`= 0,`DeleteUserId`= 0,`DeleteTime`= '2022/8/13 23:42:36',`CreateTime`= '2015/5/12 0:00:00',`UpdateUserId`= 0,`UpdateTime`= '2022/8/13 23:55:27' WHERE `id`= 5
}
#endregion
#region 导航属性
/// <summary>
/// 导航属性
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<bool> EntityRelationSave(DemoEntity entity)
{
var res = await Context.InsertNav(entity).Include(m => m.DemoDetailList).ExecuteCommandAsync();
return res;
}
#endregion
#region 缓存
/// <summary>
/// 获取数据包含缓存
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<DemoEntity> GetDataCache(int id)
{
var redisKey = $"Demo:Endity:{id}";
var demo = await RedisHelper.Client.GetAsync<DemoEntity>(redisKey);
if (demo != null)
return demo;
var aa = Context.Ado.Connection;
demo = await base.GetSingleAsync(m => m.Id == id);
await RedisHelper.Client.SetAsync(redisKey, demo, 60 * 20);
return demo;
}
#endregion
}