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

摘要:
使用(MySqlConnectionconn=DapperFactory.CrateMySqlConnection()){varlookup=newDictionary<varlist=conn.Query<tmp);returnlookup.Values.ToList();set;Operatorlookup=null;conn.Query<

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


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









class Group { public string ID{get;set;} public string Name{get;set;} public List<Rights> RightsList{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(); } }




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(); } }

免责声明:文章转载自《dapper 多对多查询对象和对象列表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Node.js源码初探~我很好奇详解S7源码3-COTP and TPKT下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php生成excel的另一种简单方法

之前我用table的方式写过excel,还用php-excel这个类库写过excel。今天,我再向大家推荐一个超级简单的写excel的方法。 代码: $xstr = "问题id 问题内容 问题回答数 问题发布时间 回答id 回答时间 回答距离问题发布 ";$xstr .= "{$askid} {$askTit} {$z_reply} {$z_asktf}...

replace into 批量更新

1、.replace into 批量更新     $sql = replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y');   test_tbl 为表名 id 对应的主键或者判断的唯一值,最好是主键,这样数据库检索较快 dr 对应这的字段,有多个字段可以在后面加上 2、insert i...

ubuntu 设置github秘钥

github的SSH配置如下: 一 、 设置Git的user name和email: $ git config --global user.name "AmyOrz" $ git config --global user.email "youremail@gmail.com" 二、生成SSH密钥过程:1.查看是否已经有了ssh密钥:cd ~/.ssh如果没...

mysql last_insert_id() (转载)

先来看看官方的说明 The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_I...

文本单词one-hot编码

单词->字母->向量 神经网络是建立在数学的基础上进行计算的,因此对数字更敏感,不管是什么样的特征数据都需要以向量的形式喂入神经网络,无论是图片、文本、音频、视频都是一样。 one-hot编码,也就是独热编码,是一种常用的编码手段。在多分类识别的时候,喂入神经网络的标签就是独热码,比如手写数字识别一共有10个分类,某张图片标签是6,则独热码为:...

python学习第6天----文件操作

1.文件操作          python中通过open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可进行各种操作(句柄就相当于一个变量),文件句柄是一个可迭代对象          打开文件的操作有:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b;默认使用的是r 1)只读操作 英雄.txt 惩戒之箭 九尾妖狐 远古...