0%

SqlSugar 联表

SqlSugar 联表查询

Join 用法

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
public IEnumerable<dynamic> GetAllUser()
{
//查询所有
return this.Context.Queryable<Users>()
.InnerJoin<Roles>((x, y) => x.RoleId == y.Id)
.Select((x, y) => new
{
Id = x.Id,
UserName = x.UserName,
Age = x.Age,
RoleName = y.RoleName
}).ToList();
}

语法糖 1

优点:好理解,5 个表以内的联表非常爽,支持功能全

缺点:联表超过 5 个以上的表后 (x,b,c…) 会比较难看,语法糖 2 可以弥补

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var tmp = db.Queryable<Order>()
.LeftJoin<Custom> ((x, y) => x.RoleId == y.Id)//多个条件用&&
.LeftJoin<OrderDetail> ((x, y, z) => x.Id == z.OrderId)
.Where(x => x.Id == 1)
.Select((x, cus) => new { Id = x.Id, RoleName = y.Name })
.ToList(); //ViewOrder 是一个新建的类,更多 Select 用法看下面文档

//内联用 .InnerJoin

//注意:Join (a,b)=> 别名用法:
//正确用法
a,b
a,b,c
a,b,c,d

//错误用法
a,b
a,c
a,d

语法糖 2

优点 1:这种适合联表比较多的比如5个以上的表 JOIN 写起来会比较爽

优点 2:因为是一个参数更容易封装成方法 例如 Queryable<T,T2>(expression)

缺点:不支持 LeftJoin(queryable) 这种嵌套

单表查询是基于 db.Queryable<T>

1
db.Queryable<Users>

联表查询是基于多个 T,例如 db.Queryable<T, T2,T3> 3 个 T 就是3表查询

1
2
3
4
5
6
7
var tmp = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
JoinType.Left, o.Id == i.OrderId, //左连接 左链接 左联
JoinType.Left, o.CustomId == c.Id
))
.Select((o,i,c)=>new { name=o.Name ..})
.ToList()

因为多个 T 的原因所以在 Where 、 Select 、OrderBy、GroupBy 操作上同单表查询稍有差别

常见错误:

数组超过界限 5 个 T 就是 4 个 JOIN , 8 个 T 就是 7 个 JOIN ,不要写多了或者写少了

语法糖 3

如果全部是 Inner Join 可以用这种方式直接联表

1
2
3
var list = db.Queryable<Order, OrderItem, Custom>((o, i, c) => o.Id == i.OrderId&&c.Id == o.CustomId)
.Select((o,i,c)=>new { Id=o.Id,Name=o.Name,CustomName=c.Name})
.ToList();

Where 用法

注意:写在 .Select() 之前

1
2
3
.Where(o=>o.id==1) //只用到 o 这样写就行

.Where((o,i)=>i.xx==1) //如果用到 i 需要这么写

OrderBy 用法

注意:写在 .Select() 之前

1
2
3
.OrderBy(o=>o.id) //只用到 o 这样写就行

.OrderBy((o,i)=>i.xx) //如果用到 i 需要这么写

GroupBy 用法

注意:写在 .Select() 之前

1
2
3
.GroupBy(o=>o.id) //只用到 o 这样写就行

.GroupBy((o,i)=>i.xx) //如果用到 i 需要这么写

Select 用法

必写:联表查询必须加上 Select,不然会查询出重复列报错 , Select 一般写在 ToList 之前

只用到 o 表可以 o=>

用到 i 表 没用到 c 表 (o,i)=> (错误用法 : i=>)

用到 c 表 (o,i,c)=> (错误 1 : c=> 错误 2 : (i,c)=> 错误 3 : (o,c)=>)

1
2
3
4
5
//新类
.Select((o,i)=>new class{Id=o.Id,Name=o.Name,SchoolName=i.Name}).ToList();

//匿名对象
.Select((o,i)=>new {Id=o.Id,Name=o.Name,SchoolName=i.Name}).ToList();

语法糖 1、2、3 的 Where、OrderBy、GroupBy、Select 用法都一样的,他们区别就在 JOIN 的方式不一样,其它都一样

Linq 查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public string GetAllUser()
{
var user = _user.GetAllUser();
var role = _role.GetAllRole();

//联接 Roles
var tmp = user.Join(role, x => x.RoleId, p => p.Id, (x, p) => new
{
Id = x.Id,
Name = x.Name,
Age = x.Age,
RoleName = p.RoleName
});

return new
{
Code = 200,
Msg = "获取所有用户信息成功!",
Data = tmp
}.SerializeObject();
}

欢迎关注我的其它发布渠道