关于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

 

posted on 2017-03-23 12:06  阿鄙  阅读(134)  评论(0)    收藏  举报