在asp.net zero 中實現單表增刪改查:
編寫增刪改查服務方法
API測試服務
刪除實體
注意在刪除實體Delete(EntityDto input),可以先查詢再修改,也可以直接刪除實體,刪除實體注意要轉換成主鍵類型
public async Task Delete(EntityDto input)
{
//先查詢再修改
//var demoObject = await _demoObjectRepository.GetAsync(input.Id);
//await _demoObjectRepository.DeleteAsync(demoObject);
//直接刪除實體,注意轉換id,不轉換則刪不了
await _demoObjectRepository.DeleteAsync((int)input.Id);
}
查詢實體
在分頁查詢數據集合時,需要先排序再映射,可能是Entity Framework 3.1的問題,也可能是System.Linq.Dynamic.Core程序集的問題,如果先映射再排序分頁,就會出現錯誤:具體原因還沒找到,另外一點CountAsync需要引用using Abp.Linq.Extensions; OrderBy動態查詢需要引用using System.Linq.Dynamic.Core;
查詢實體報的錯誤:
下面是修改後的代碼(先排序再映射):
public async Task<PagedResultDto<GetDemoObjectForViewDto>> GetAll(GetAllDemoObjectInput input)
{
//注意這裏要用Abp.Linq.Extensions,否則返回的是IEnumerable類型
var filter = _demoObjectRepository.GetAll()
.WhereIf(!string.IsNullOrWhiteSpace(input.Filter), e => e.Name.Contains(input.Filter))
.WhereIf(!string.IsNullOrWhiteSpace(input.NameFilter), e => e.Name.Equals(input.NameFilter));
//先排序,再映射
filter = filter.OrderBy(input.Sorting ?? "id asc");//OrderBy來自System.Linq.Dynamic.Core
var query = (from o in filter
orderby o.Id
select new GetDemoObjectForViewDto()
{
DemoObject = ObjectMapper.Map<DemoObjectDto>(o)
});
var totalCount = await query.CountAsync(); //CountAsync來自Abp.Linq.Extensions
var demoObject = await query
.PageBy(input)
.ToListAsync();
var result = new PagedResultDto<GetDemoObjectForViewDto>()
{
TotalCount = totalCount,
Items = demoObject
};
return result;
}
下面是整個服務類:
using Abp.Application.Services.Dto;
using Abp.Collections.Extensions;
using Abp.Domain.Repositories;
using EDU.SIS.Demo.Dtos;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Abp.Linq.Extensions;
using System.Linq.Dynamic.Core;
namespace EDU.SIS.Demo
{
public class DemoObjectAppService : SISAppServiceBase, IDemoObjectAppService
{
private readonly IRepository<DemoObject> _demoObjectRepository;
public DemoObjectAppService(IRepository<DemoObject> demoObjectRepository)
{
_demoObjectRepository = demoObjectRepository;
}
/// <summary>
/// 創建和修改
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task CreateOrEdit(CreateOrEditDemoObjectDto input)
{
if (input.Id==null)
{
//創建
await Create(input);
}
else
{
//修改
await Update(input);
}
}
/// <summary>
/// 創建實體
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task Create(CreateOrEditDemoObjectDto input)
{
var demoObject = ObjectMapper.Map<DemoObject>(input);
await _demoObjectRepository.InsertAsync(demoObject);
}
/// <summary>
/// 修改實體
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task Update(CreateOrEditDemoObjectDto input)
{
var demoObject = await _demoObjectRepository.FirstOrDefaultAsync((int)input.Id);
var demo = ObjectMapper.Map(input, demoObject);
//await _demoObjectRepository.UpdateAsync(demo);
}
/// <summary>
/// 數據刪除
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task Delete(EntityDto input)
{
var demoObject = await _demoObjectRepository.GetAsync(input.Id);
await _demoObjectRepository.DeleteAsync(demoObject);
}
/// <summary>
/// 分頁查詢所有實體
/// </summary>
/// <param name="input">分頁排序篩選</param>
/// <returns></returns>
public async Task<PagedResultDto<GetDemoObjectForViewDto>> GetAll(GetAllDemoObjectInput input)
{
//注意這裏要用Abp.Linq.Extensions,否則返回的是IEnumerable類型
var filter = _demoObjectRepository.GetAll()
.WhereIf(!string.IsNullOrWhiteSpace(input.Filter), e => e.Name.Contains(input.Filter))
.WhereIf(!string.IsNullOrWhiteSpace(input.NameFilter), e => e.Name.Equals(input.NameFilter));
//先排序,再映射
filter = filter.OrderBy(input.Sorting ?? "id asc");//OrderBy來自System.Linq.Dynamic.Core
var query = (from o in filter
orderby o.Id
select new GetDemoObjectForViewDto()
{
DemoObject = ObjectMapper.Map<DemoObjectDto>(o)
});
var totalCount = await query.CountAsync(); //CountAsync來自Abp.Linq.Extensions
var demoObject = await query
.PageBy(input)
.ToListAsync();
var result = new PagedResultDto<GetDemoObjectForViewDto>()
{
TotalCount = totalCount,
Items = demoObject
};
return result;
}
/// <summary>
/// 獲取修改數據詳情
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<GetDemoObjectForEditOutput> GetDemoObjectForEdit(EntityDto input)
{
var demoObject = await _demoObjectRepository.GetAsync(input.Id);
var result = new GetDemoObjectForEditOutput()
{
DemoObject = ObjectMapper.Map<DemoObjectDto>(demoObject)
};
return result;
}
/// <summary>
/// 獲取單條數據
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<GetDemoObjectForViewDto> GetDemoObjectForView(int id)
{
var demoObject = await _demoObjectRepository.GetAsync(id);
var result = new GetDemoObjectForViewDto()
{
DemoObject = ObjectMapper.Map<DemoObjectDto>(demoObject)
};
return result;
}
}
}
API測試
分頁查詢:
創建實體
修改實體
刪除實體
在刪除實體時,無法用post,提示405錯誤,還沒找到原因,可能是需要傳遞http頭部參數,這裏只能用delete方法,可以刪除實體: