5.x文档地址
http://www.donet5.com/Home/Doc
.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;}
}2016 © donet5.comApache Licence 2.0