dapper 多对多查询对象和对象列表

34 篇文章 0 订阅

角色:

class Group
{
    public string ID{get;set;}
    public string Name{get;set;}
    public List<Rights> RightsList{get;set;}
}

权限:

class Rights
{
    public string ID{get;set;}
    public string Name{get;set;}
}

角色-权限关系表:

CREATE TABLE `t_group_right` (
  `rightId` varchar(50) NOT NULL,
  `groupId` varchar(50) NOT NULL,
  KEY `FK_group_rights_id` (`rightId`),
  KEY `FK_rights_group_id` (`groupId`),
  CONSTRAINT `FK_group_rights_id` FOREIGN KEY (`rightId`) REFERENCES `t_rights` (`id`),
  CONSTRAINT `FK_rights_group_id` FOREIGN KEY (`groupId`) REFERENCES `t_group` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查询角色列表:

 public List<Group> GetAll()
        {
            string sql = "SELECT a.*,c.* FROM t_group  a left join t_group_right b on a.id = b.groupid left join t_rights c on c.id=b.rightid ";
            using (MySqlConnection conn = DapperFactory.CrateMySqlConnection())
            {
                var lookup = new Dictionary<string, Group>();
                var list = conn.Query<Group, Rights, Group>(sql, (g, r) =>
                {
                    Group tmp;
                    if (!lookup.TryGetValue(g.ID, out tmp))
                    {
                        tmp = g;
                        lookup.Add(g.ID, tmp);
                    }

                    tmp.RightsList.Add(r);

                    return g;
                }
                , splitOn: "id").ToList();
                return lookup.Values.ToList();
            }

        }

splitOn参数:用来指定列为分隔列,之前的列为前一对象,之后的列为后一对象。
lookup 用来保存中间处理结果,可以理解为将结果归组出Group对象,并为其RightsList添加内容,
注意:lookup中添加的是临时定义的Group对象,并在循环中将此对象从lookup中取出,为其RightsList添加Rights

Operator对象:

class Operator{
    public string ID{get;set;}
    public string Name{get;set;}
    [NoWrite]
    public List<Group> GroupList { get; set; }
    [NoWrite]
    public List<Rights> RightsList { get; set; }
}

查询一个Operator对象:

 public Operator Get(string id)
        {
            using (MySqlConnection conn = DapperFactory.CrateMySqlConnection())
            {
                string sql = "SELECT a.*,c.*,e.* FROM t_operator a left join t_operator_group b on a.id = b.operatorid left join t_group c on c.id=b.groupid " +
                        "left join t_operator_rights d on a.id = d.operatorid left join t_rights e on e.id = d.rightid where a.id=@id";
                Operator lookup = null;
                conn.Query<Operator, Group, Rights, Operator>(sql, (o, g, r) =>
                {
                    if (lookup == null)
                    {
                        lookup = o;
                    }
                    Group tmp = lookup.GroupList.Find(f => f.ID == g.ID);
                    if (tmp == null)
                    {
                        tmp = g;
                        lookup.GroupList.Add(tmp);
                    }
                    tmp.RightsList.Add(r);
                    lookup.RightsList.Add(r);
                    return o;
                },
                param: new { id = id },
                splitOn: "id");
                return lookup;
            }

        }

获取Operator列表:

 public List<Operator> GetAll()
        {
            using (MySqlConnection conn = DapperFactory.CrateMySqlConnection())
            {
                string sql = "SELECT a.*,c.*,e.* FROM t_operator a left join t_operator_group b on a.id = b.operatorid left join t_group c on c.id=b.groupid " +
                        "left join t_operator_rights d on a.id = d.operatorid left join t_rights e on e.id = d.rightid";
                var lookup = new Dictionary<string,Operator>();
                conn.Query<Operator, Group, Rights, Operator>(sql, (o, g, r) =>
                {
                    Operator tmp;
                    if (!lookup.TryGetValue(o.ID,out tmp))
                    {
                        tmp = o;
                        lookup.Add(o.ID,tmp);
                    }
                    Group tmpG = tmp.GroupList.Find(f => f.ID == g.ID);
                    if (tmpG == null)
                    {
                        tmpG = g;
                        tmp.GroupList.Add(tmpG);
                    }
                    //角色权限列表
                    Rights tmpR = tmpG.RightsList.Find(f => f.ID == r.ID);
                    if (tmpR == null)
                    {
                        tmpG.RightsList.Add(r);
                    }
                    //用户权限列表
                    tmpR = tmp.RightsList.Find(f => f.ID == r.ID);
                    if (tmpR == null)
                    {
                        tmp.RightsList.Add(r);
                    }

                    return o;
                },
                splitOn: "id");
                return lookup.Values.ToList();
            }
        }
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值