.Mapper用法

 

.Mapper提供了一对多、一对一和多对多的快捷映射,高性能并且不会产生循环,和EF不同的是SqlSugar不需要去配置映射关系比较灵活。


Mapper有两种模式一对是自由映射模式还有一种是自动映射模式



自动映射模式有三种用法


1.根据两个实体中相同名称的字称字段进行映谢,如果A实体有OrgId ,B实体也有OrgId

var list= db.Queryable<MyOrder>()
                .Mapper(it => it.Persons, it => it.orgId) //支持多个自动映射一起用
                //Orm就知道从 myorder里面的orgId去关联 persons里面的orgid
                .ToList();



2.指定主表中的某个字段和子对象的主键进行关联

var list= db.Queryable<MyOrder/*主对象*/>()
                .Mapper(it => it.masterPerson/*要填充的子对象*/, it => it.masterPersonId/*主对象中的masterPersonId*/)
                //根据MyOrder中的masterPersonId和Person表的主键关连
                .ToList();



3.指定子对象中的字段去找主对象的主键


var list= db.Queryable<MyOrder>()
                .Mapper(it => it.OrderItems/*要填充的子对象*/, it => it.OrderItems.First().masterOrderId/*子对象中的masterOrderId*/ )
                //OrderItem表中的masterOrderId 去找MyOrder中的主键
                .ToList();


实体结构

public class MyOrder
        {
            [SqlSugar.SugarColumn(IsPrimaryKey=true,IsIdentity =true)]
            public int orderId { get; set; }
            public string orderName { get; set; }
            public string orgId { get; set; }
            public int masterPersonId { get; set; }
            [SqlSugar.SugarColumn(IsIgnore = true)]
            public List<OrderItem> OrderItems { get; set; }
            [SqlSugar.SugarColumn(IsIgnore = true)]
            public OrderItem OrderItemSignle { get; set; }
            [SqlSugar.SugarColumn(IsIgnore = true)]
            public List<Person> Persons { get; set; }
            [SqlSugar.SugarColumn(IsIgnore = true)]
            public Person masterPerson { get; set; }

        }
        public class Person
        {
            [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int PersonId { get; set; }
            public string orgId { get; set; }
        }
        public class OrderItem
        {
            [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int itemId { get; set; }
            public int masterOrderId { get; set; }
        }







自由映射模式


1.只做简单格式转换

var list= db.Queryable<MyOrder>()
                .Mapper(it => {
                    it.orderName = it.orderName + "aa";//可以写C#代码转换你要的格式
                    
                })
         .ToList();



2.Mapper.Cache用法

   var s12 = db.Queryable<Student>()
 
   .Mapper((it, cache) =>
                {
                        
                    //一次性查询出所要的外键引用数据
                    var allSchools = cache.GetListByPrimaryKeys<School>(vmodel => vmodel.SchoolId);
                    //sql select * from shool where id 
                    //id in(list[0].SchoolId , list[1].SchoolId...)
 
                    //等同于上面写法这写法可以做复杂操作
                    //var allSchools2= cache.Get(list =>
                    // {
                    //     var ids=list.Select(i => it.SchoolId).ToList(); 
                    //     return db.Queryable<School>().In(ids).ToList();
                    //}); 其中list是我们select()查询出来的对象,我们根据list查询出所有需要的外键,
                    //     然后一次性查询出我们要的数据进入缓存给下面的方案使用,这样就避免了循环
 
                    /*一对一*/
                    //高性能
                    it.School = allSchools.FirstOrDefault(i => i.Id == it.SchoolId);
 
                    //性能差相当于循环
                    //it.School = db.Queryable<School>().InSingle(it.SchoolId); 
 
 
                    /*一对多*/
                    it.Schools = allSchools.Where(i => i.Id == it.SchoolId).ToList();
 
 
                    /*用C#处理你想要的结果*/
                    it.Name = it.Name == null ? "null" : it.Name;
     }).ToList();
      
     public class Student{
      
        public int Id{get;set;}
        public string Name{get;set;}
        public int SchoolId{get;set;}
        public List<School> Schools{get;set;}
        public School School{get;set;}
     }
     public class School{
      
        public int Id{get;set;}
        public string Name{get;set;}
     }










































































收藏到朋友圈: