关于ABP架构,以及2017.03.10项目问题及
前提不要将映射写错!!不要将映射写错!!不要将映射写错!!
重要的事情说3遍!
有两种映射方式:
第一种:使用 AutoMapFrom 在DTO中映射对应的实体类
1 //自动映射 2 //[AutoMapFrom(typeof(newYXTSUpply))] 3 //[AutoMapFrom(typeof(YXTMarket))] 4 [AutoMapFrom(typeof(YXTSupply))] 5 public class YXTSupplyListDto : EntityDto<int> 6 { 7 [DisplayName("原产地")] 8 public string Origin { get; set; } 9 }
第二种:在 模块配置(某某某ApplicationModule)的 PreInitialize方法下 配置 DTO相对应的实体类 的映射
1 public override void PreInitialize() 2 { 3 4 Configuration.Modules.AbpAutoMapper().Configurators.Add(mapper => 5 { 6 //Add your custom AutoMapper mappings here... 7 //手动设置映射 8 //mapper.CreateMap<,>() 9 10 }); 11 12 }
ABP框架下Lambda联合查询
需要建立一个接收数据解析的实体类(本例的实体类是YXTSupplyListDto)。要写成公有类!并且将这个类与DTO建立映射关系。应该可以直接(MapTo)到DTO中(此处未详细验证)。
实现:
1 var query = _yXTSupplyRepository.GetAll(); 2 //TODO:根据传入的参数添加过滤条件 3 var query2 = _yXTMarketRepository.GetAll(); 4 var query3 = _yXTOriginRepository.GetAll(); 5 //var test = query.Join(query2, a => a.MarketID, b => b.Id, (a, b) => new { a, b }); 6 //var test2 = query2.GroupJoin(query, a => a.Id, b => b.MarketID, (a, b) => new { a=a,b=b }).Select(o=>o).ToList(); 7 var test2 = query.Join(query2, a => a.MarketID, b => b.Id, (a, b) => new { a, b }) 8 .Join(query3, o => o.a.OriginID, c => c.Id, (o, c) => new { o, c }) 9 .Select( 10 p => new YXTSupplyListDto 11 { 12 Id = p.o.a.Id, 13 CreationTime = p.o.a.CreationTime, 14 DownTime = p.o.a.DownTime, 15 Origin = p.c.OriginName, 16 MarketName = p.o.b.MarketName, 17 Price = p.o.a.Price, 18 UpTime = p.o.a.UpTime, 19 Stock = p.o.a.Stock, 20 State = p.o.a.State, 21 SupplyUID = p.o.a.SupplyUID, 22 Pageviews = p.o.a.Pageviews, 23 Types = p.o.a.Types, 24 MerchandiseID = p.o.a.MerchandiseID, 25 Sell = p.o.a.Sell, 26 Gross = p.o.a.Gross 27 } 28 ); 29 30 var yXTSupplyCount = await test2.CountAsync(); 31 32 var yXTSupplys = await test2.OrderBy(input.Sorting).PageBy(input).ToListAsync(); 33 34 //var yXTSupplyListDtos = yXTSupplys.MapTo<List<YXTSupplyListDto>>();// Mapper.Map<List<YXTSupplyListDto>>(yXTSupplys); 35 return new PagedResultDto<YXTSupplyListDto>(yXTSupplyCount, yXTSupplys);
ABP框架下外键关联
获取数据:
1 //获取源 2 var query = _yXTSupplyRepository.GetAll().Include("Market").Include("Origin").Include("Merchandise"); 3 //var lst = query.ToList(); 4 //计算条数 5 var yXTSupplyCount = await query.CountAsync(); 6 //排列 7 var yXTSupplys = await query.OrderBy(input.Sorting).PageBy(input).ToListAsync(); 8 //转换成DTO 9 var yXTSupplyListDtos = yXTSupplys.MapTo<List<YXTSupplyListDto>>(); 10 //输出 11 return new PagedResultDto<YXTSupplyListDto>(yXTSupplyCount, yXTSupplyListDtos);
设置数据库:
主表加上,外联表不需要做修改(可能顺序颠倒,请指正。)
public virtual YXTMarket Market{ get; set; }
///Up 20170420
以上方式会出现一个问题,删除(软删除)外键表的数据后,页面会出现页码数量与查询出来的数据记录数量不匹配。(版本为1.5.0)。
说人话就是,Count这个函数生成的SQL语句的主题与query所生成的语句不相同。
//获取条数 var yXTSupplyCount = await query.CountAsync();
此处获取的是主表数据的条数,仅仅过滤了主表的IsDelete字段的数据,并不是数据源(query)所查询出来的数据条数。(使用的是外键链接方式)
联合查询并未测试。
///endUp
浙公网安备 33010602011771号