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);
}
}
结果如图: