AutoMapper使用示例(二)【常规的转换器和分页功能】

Model层模型如下:

    public class SrcEmployee
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public string Status { get; set; }
        public DateTime HireDate { get; set; }
    }

    public class DestEmployee
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public EmployeeStatus Status { get; set; }
        public string HireDate { get; set; }
    }

   public interface IPagedList
    {
        int TotalCount { get; set; }
        int PageIndex { get; set; }
        int PageSize { get; set; }
        bool IsPreviousPage { get; }
        bool IsNextPage { get; }
    }
Program.cs代码如下:

  class Program
    {
        static void Main()
        {
             
            var srcEmp = new SrcEmployee
                             {
                                 Name = "天帝",
                                 Age = "244",
                                 Status = "离职",
                                 HireDate = Convert.ToDateTime("2010/2/1")
                             };


              List<SrcEmployee> srcEmpList =new List<SrcEmployee>();



              srcEmpList.Add(new SrcEmployee
              {
                  Name = "朱雀",
                  Age = "24",
                  Status = "在职",
                  HireDate = Convert.ToDateTime("2016/2/1")
              });

             srcEmpList.Add(new SrcEmployee {
                                 Name = "玄武",
                                 Age = "26",
                                 Status = "离职",
                                 HireDate = Convert.ToDateTime("2010/12/1")
                             });

              srcEmpList.Add(new SrcEmployee {
                                 Name = "青龙",
                                 Age = "24",
                                 Status = "离职",
                                 HireDate = Convert.ToDateTime("2015/2/11")
                             });

              srcEmpList.Add(new SrcEmployee {
                                 Name = "白虎",
                                 Age = "27",
                                 Status = "在职",
                                 HireDate = Convert.ToDateTime("2016/12/15")
                             });


            //Mapper映射器转换
            Mapper.CreateMap<string, int>().ConvertUsing(Convert.ToInt32);
            Mapper.CreateMap<DateTime, string>().ConvertUsing<CustomDateTimeConverter>();

            //SrcEmployee -> DestEmployee转换
            Mapper.CreateMap<SrcEmployee, DestEmployee>().ForMember(dest => dest.Status, opt => opt.ResolveUsing<EmployeeStatusResolver>());
            var destEmp = Mapper.Map<SrcEmployee, DestEmployee>(srcEmp);
            
            
            Console.WriteLine("名字:{0},年龄:{1},状态:{2},雇佣时间:{3}", destEmp.Name, destEmp.Age, destEmp.Status, destEmp.HireDate);

            Console.WriteLine("---------------------------------------------------------------------------");

            int pageSize = 3;
            int page = 0;
            IQueryable<SrcEmployee> posts = srcEmpList.OrderByDescending(p => p.HireDate).AsQueryable();
            PagedList<DestEmployee> pagedList = posts.ToPagedList<SrcEmployee, DestEmployee>(page, Mapper.Map<IEnumerable<SrcEmployee>, IEnumerable<DestEmployee>>, pageSize);

            pagedList.ToList().ForEach(delegate(DestEmployee de)
            {
                Console.WriteLine(de.Name+"受雇于:"+de.HireDate);
            });
            Console.ReadKey();

        }
  
    }
 public enum EmployeeStatus { Stay, Exit, LongHoliday } ;


    /// <summary>
    ///  DateTime -> string 
    /// </summary>
    public class CustomDateTimeConverter : TypeConverter<DateTime, string>
    {
        protected override string ConvertCore(DateTime source)
        {
            return source.ToString("yyyy年MM月dd日");
        }
    }

    /// <summary>
    /// 
    /// </summary>
    public class EmployeeStatusResolver : ValueResolver<SrcEmployee, EmployeeStatus>
    {
        protected override EmployeeStatus ResolveCore(SrcEmployee source)
        {
            switch (source.Status)
            {
                case "在职":
                    return EmployeeStatus.Stay;
                case "离职":
                    return EmployeeStatus.Exit;
                case "长期休假中":
                    return EmployeeStatus.LongHoliday;
                default:
                    throw new UnKnowonEmployeeStatusException();
            }
        }
    }

    public class UnKnowonEmployeeStatusException : Exception { }
PagedList.cs代码如下:

/// <summary>
    /// 使用AutoMapper PagedList的实现,从一个IQueryable发出视图模型。
     ///AutoMapper是没有明确要求,但创建映射器参数的最简单方法。
    /// </summary>
    /// <typeparam name="TSource">类型(模型)</typeparam>
    /// <typeparam name="TOutput">输出类型(视图模型)</typeparam>
    public class MappedPagedList<TSource, TOutput> : PagedList<TOutput>
    {
        /// <param name="source">IQueryable</param>
        /// <param name="index">从零开始的页面索引</param>
        /// <param name="pageSize">每页显示数</param>
        /// <param name="mapper">映射函数,最容易使用AutoMapper创建</param>
        public MappedPagedList(IQueryable<TSource> source, int index, int pageSize, Func<IEnumerable<TSource>, IEnumerable<TOutput>> map)
            : base(index, pageSize, source.Count())
        {
            this.AddRange(map(source.Skip(index * pageSize).Take(pageSize).ToList()));
        }

        /// <param name="source">list</param>
        /// <param name="index">从零开始的页面索引</param>
        /// <param name="pageSize">每页显示数</param>
        /// <param name="mapper">映射函数,最容易使用AutoMapper创建</param>
        public MappedPagedList(List<TSource> source, int index, int pageSize, Func<IEnumerable<TSource>, IEnumerable<TOutput>> map)
            : base(index, pageSize, source.Count())
        {
            this.AddRange(map(source.Skip(index * pageSize).Take(pageSize).ToList()));
        }
    }

    public class PagedList<T> : List<T>, IPagedList
    {
        public PagedList(IQueryable<T> source, int index, int pageSize)
            : this(index, pageSize, source.Count())
        {
            this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList());
        }

        public PagedList(List<T> source, int index, int pageSize)
            : this(index, pageSize, source.Count())
        {
            this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList());
        }

        protected PagedList(int index, int pageSize, int totalCount)
        {
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.TotalCount = totalCount;
        }

        public int TotalCount { get; set; }
        public int PageIndex { get; set; }
        public int PageSize { get; set; }

        public bool IsPreviousPage { get { return (PageIndex > 0); } }
        public bool IsNextPage { get { return (PageIndex * PageSize) < TotalCount - PageSize; } }
    }

    public static class Pagination
    {
        public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index, int pageSize = 10)
        {
            return new PagedList<T>(source, index, pageSize);
        }

        public static MappedPagedList<TSource, TOutput> ToPagedList<TSource, TOutput>(this IQueryable<TSource> source, int index, Func<IEnumerable<TSource>, IEnumerable<TOutput>> mapper, int pageSize = 10)
        {
            return new MappedPagedList<TSource, TOutput>(source, index, pageSize, mapper);
        }
    }
结果如图:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值