多级查询

1、一对一查询

 public class OrderItem {
        [SugarColumn(IsPrimaryKey =true ,IsIdentity =true)]
        public int ItemId { get; set; }
        public string ItemCode { get; set; }
        public decimal Pirce { get; set; }
        public int OrderId { get; set; }
        [SugarColumn(IsIgnore =true)]
        public Order Order{ get; set; }
    }
    public class Order {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Name { get; set; }
        [SugarColumn(IsIgnore = true)]
        public List<OrderItem> Items { get; set; }
    }
var list= db.Queryable<OrderItem>().Mapper(it => it.Order, it => it.OrderId).ToList();


2、一对多查询

public class Order
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Name { get; set; }
        [SugarColumn(IsIgnore = true)]
        public List<OrderItem> Items { get; set; }
    }
    public class OrderItem {
        [SugarColumn(IsPrimaryKey =true ,IsIdentity =true)]
        public int ItemId { get; set; }
        public string ItemCode { get; set; }
        public decimal Pirce { get; set; }
        public int OrderId { get; set; }
        [SugarColumn(IsIgnore =true)]
        public Order Order{ get; set; }
    }
  var list= db.Queryable<Order>().Mapper(it => it.Items, it => it.Items.First().OrderId).ToList();


3、 多对多查询

 public class ABMapping
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int AId { get; set; }
        public int BId { get; set; }
        [SugarColumn(IsIgnore = true)]
        public A A { get; set; }
        [SugarColumn(IsIgnore = true)]
        public B B { get; set; }
    }
    public class A {
        [SugarColumn(IsPrimaryKey =true ,IsIdentity =true)]
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public class B
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Name { get; set; }
    }
  var list= db.Queryable<ABMapping>()
                .Mapper(it => it.A,it=>it.AId)
                .Mapper(it => it.B, it => it.BId).ToList();


4、 根据相同的属性名实现查询

    public class A {
        [SugarColumn(IsPrimaryKey =true ,IsIdentity =true)]
        public int Id { get; set; }
        public string Name { get; set; }
        public string OrgId { get; set; }
        [SugarColumn(IsIgnore =true)]
        public B B { get; set; }
    }
    public class B
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Name { get; set; }
        public string OrgId { get; set; }
    }
   var list= db.Queryable<A>().Mapper(it => it.B,it=>it.OrgId).ToList();



4、有相同属性名默认会走相同属性名逻辑,这里可以强制控制


public class Tree
{
        [SqlSugar.SugarColumn(IsPrimaryKey =true)]
        public int Id { get; set; }
        public string Name { get; set; }
        public int ParentId { get; set; }
        [SqlSugar.SugarColumn(IsIgnore = true)]
        public Tree Parent { get; set; }
        [SqlSugar.SugarColumn(IsIgnore = true)]
        public List<Tree> Child { get; set; }
}
var list=db.Queryable<Tree>()
                   //parent=(select * from parent where id=it.parentid)
                   .Mapper(it=>it.Parent,it=>it.ParentId, it=>it.Parent.Id)
                   //Child=(select * from parent where ParentId=it.id)
                   .Mapper(it => it.Child, it => it.Id, it => it.Parent.ParentId)
                   .ToList();


5、 自定义查询

当我们需要灵活进行多级查询时我们可以这么写

List<Order> list = db.Queryable<Order>().Mapper((orderItem,cache)=> {

    orderItem.Items = db.Queryable<OrderItem>().Where(it => it.OrderId == orderItem.Id).ToList();

}).ToList();//缺点性能差会引起循环


如果要考虑性能可以写成下面这样,和上面的功能一样

List<Order> list = db.Queryable<Order>().Mapper((orderItem,cache)=> {
    //cache.get 内的方法永远只执行一次
    List<OrderItem> allOrderItems = cache.Get(ol => //db.queryable<order>().tolist()等于ol
    {
        var allOrderIds = ol.Select(x => x.Id).ToList();
        return db.Queryable<OrderItem>().In(it => it.OrderId, allOrderIds).ToList();//一次性查询出所有Order集合所需要的Items
    });

    orderItem.Items = allOrderItems.Where(it => it.OrderId == orderItem.Id).ToList();//循环从内存读取当前Order需要的Items

}).ToList();


实体

 public class Order
 {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }

        public string Name { get; set; }
        public decimal Price { get; set; }
        [SugarColumn(IsNullable = true)]
        public DateTime CreateTime { get; set; }
        [SugarColumn(IsNullable =true)]
        public int CustomId { get; set; }
        [SugarColumn(IsIgnore = true)]
        public List<OrderItem> Items { get; set; }
  }