asp.net zero 8.2 學習-5-實現增刪改查服務及API測試

在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方法,可以刪除實體:

查詢單個實體

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章