ORM-Dapper学习<五>.Dapper的进阶用法

1.    联合查询

A.    写法一
public user_info_model get_user_info__group_info(int id)
        {
            using (conn)
            {
                string query = @"SELECT * FROM dbo.user_info U
                                 LEFT JOIN user_group UG
                                 ON U.id=UG.user_info_id
                                 WHERE U.id = @id";
                user_info_model userinfo = null;
                var b = conn.Query<user_info_model, user_group_model, user_info_model>(query,
                    (user, group) =>
                    {
                        if (userinfo == null || userinfo.id != user.id)
                            userinfo = user;
                        if (group != null)
                            userinfo.Reviews.Add(group);
                        return userinfo;
                    }, new { id },splitOn: "user_info_id").Distinct().SingleOrDefault();
                return b;
            }
        }
附:关键字Reviews在model的属性
public virtual user_group_model usergroup { get; set; }
B.    写法二

注一:连表主键都是唯一且都为id/ID时,示例如下:

var sql = @"SELECT * FROM dbo.user_info U INNER JOIN group_info G ON U.id = G.id";
var data = conn.Query<user_info_model, group_info_model, user_info_model>(sql, (user_info, group_info) => { user_info.groupinfo = group_info; return user_info; });

注二:Dapper 假定你的 ID 列被命名为“ID”或“id”,如果你的主键是不同的,或者你想在点上拆分宽行点,而不是“ID”,可以使用可选的“splitOn”参数。不选会出现这个异常:“When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id.”

splitOn的用法示例:

var sql = @"SELECT * FROM dbo.user_info U LEFT JOIN user_group UG ON U.id = UG.user_info_id LEFT JOIN group_info G ON UG.group_info_id = G.id ";
var data = conn.Query<user_info_model, user_group_model, user_info_model>(sql, (user_info, user_group) => { user_info.usergroup = user_group; return user_info; }, splitOn: "user_info_id,group_info_id");

2.    返回多个结果

public void get_moredb(int id)
        {
            var sql = @"SELECT * FROM dbo.user_info WHERE [email protected]
                        SELECT * FROM dbo.group_info WHERE [email protected]";

            using (var multi = conn.QueryMultiple(sql, new { id = id }))
            {
                var user = multi.Read<user_info_model>().Single();
                var group = multi.Read<group_info_model>().ToList();
            }
        }

3.    执行存储过程

A.    简单写法
public void execute_user_info_withpms(user_info_model user)
       {
            var ur = conn.Query<user_info_model>("p_get_user_info_by_id",
new { id = user.id }, commandType: CommandType.StoredProcedure).First();
}
B.    灵活写法

注:返回OUTPUT/RETURN等结果

public void execute_user_info_withpms(user_info_model user)
        {
            int result = 0;
            var result2 = 0;
            DynamicParameters pms = new DynamicParameters();
            pms.Add("@name", user.name);
            pms.Add("@pwd", user.pwd);
            pms.Add("@loginDate", user.loginDate);
            //返回SP中Output的值
            pms.Add("@result", null, DbType.Int32, ParameterDirection.Output);
            //返回SP中Return的值
            pms.Add("@result2", null, DbType.Int32, ParameterDirection.ReturnValue);
            using (conn)
            {
                conn.Execute("dbo.p_insert_user_info", pms, null, null, CommandType.StoredProcedure);
                result = pms.Get<int>("@result");
                result2 = pms.Get<int>("@result2");
            }
        }

4.    Ansi String 和 Varchar

注: SQL Server 上,当查询非 Unicode 时,查询 Unicode ANSI 时需要使用 UnicodeDapper 支持 varchar 参数,如果你在一个 varchar 列上执行一个 where 语句,确保下面方式传递参数:

public IEnumerable<user_info_model> ansiStrings()
        {
            var str = conn.Query<user_info_model>("select * from user_info where name = @name", new { name = new DbString { Value = "Test1", IsFixedLength = true, Length = 10, IsAnsi = true } });
            return str;
        }

5.    事务处理

public int transaction(user_info_model user)
        {
            //继承SQL的链接以保证事务在同一个链接中执行
            using (IDbConnection _conn = conn)
            {
                //开始事务
                IDbTransaction transaction = _conn.BeginTransaction();
                try
                {
                    string query = @"DELETE FROM user_info WHERE id = @id";
                    string query2 = @"DELETE FROM user_group WHERE user_info_id = @id ";
                    int row = _conn.Execute(query, new { id = user.id }, transaction);
                    row += _conn.Execute(query2, new { id = user.id }, transaction);

                    //提交事务
                    transaction.Commit();
                    return row;
                }
                catch (Exception ex)
                {
                    //出现异常,事务Rollback
                    transaction.Rollback();
                    throw new Exception(ex.Message);
                }
            }
时间: 2024-12-22 06:51:04

ORM-Dapper学习<五>.Dapper的进阶用法的相关文章

Dapper学习(三)之其他用法

这里说的其他用法,是指 Async,Buffered,Transaction,Stored Procedure. 1. 首先 dapper支持异步 ExecuteAsync, QueryAsync, QueryFirstAsync, QueryFirstOrDefaultAsync, QuerySingleAsync, QuerySingleOrDefaultAsync, QueryMultipleAsync ExecuteAsync 用法示例: string sql = "INSERT INT

ORM之轻量级框架--Dapper

转自:https://www.cnblogs.com/Erhao/p/10042808.html 一.什么是Dapper? Dapper是一款轻量级Orm框架,它是属于半自动的,它和Entity Framework和NHibernate不同,它只有一个单文件,没有很复杂的配置,如果你喜欢原生Sql语句,而且又是喜欢Orm框架,那么Dapper对于你来说是再适合不过了. 二.Dapper优点我也是刚开始学习Dapper,让我自己去总结它的优点,可能也就还没真正去体验到带来的好.所以我也是抱着学习的

Python爬虫进阶五之多线程的用法

前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread 库,一个是 multiprocessing 库.而多线程 thread 在 Python 里面被称作鸡肋的存在!而没错!本节介绍的是就是这个库 thread. 不建议你用这个,不过还是介绍下了,如果想看可以看看下面,不想浪费时间直接看 multiprocessing 多进程 鸡肋点 名言: "Pyt

Django框架学习-Model进阶用法

Model进阶用法 回顾 访问外键 访问多对多关系 更改数据库结构 当处理数据库结构改变时,需要注意到几点: 增加字段 首先在开发环境中: 再到产品环境中: 删除字段 删除多对多字段 删除model Manager管理器 给管理器添加新的方法 修改返回的QuerySet Model的方法 执行自定义SQL语句 Model进阶用法 回顾 Django中的model层主要和数据库进行交互,使用数据库API对数据库进行增删改查的操作. 下面将介绍关于model层更深入的用法. 下面是之前创建model

别再互联网寒冬了,还不如学习一下这些Java进阶技术。

天天互联网寒冬,其实哪里有什么互联网寒冬,只不过是你穿的少而已,有那个时间去关心互联网寒冬会倒下多少人,还不如学习一下这些Java进阶技术. 其涵盖的技术点比较全面,并非一朝一夕能够全部覆盖到的.对于一些还没有入门或者刚刚入门的Java后端工程师,如果一下子需要学习如此多的知识,想必很多人会望而却步. 本文截取了技能树中的一些关键技能点,大家都知道,想成为牛逼的JAVA开发,就是JAVA架构师了.本文小编来针对JAVA从业朋友分享JAVA架构进阶之路. JAVA架构之路这块,主要有六大专题,先给

第五篇 函数进阶

目录 第五篇 函数进阶 一 闭包函数 二 装饰器 三 迭代器 四 三元表达式 五 列表推导式 六 字典生成式 七 生成器 八 递归 九 匿名函数 十 内置函数 第五篇 函数进阶 ==回顾基础== 函数对象:可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制. 名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了,与调用位置无关,即在任意位置调用函数都需要跑到定义函数时找到作用域关系. 一 闭包函数 闭包 闭就是封闭(函数内部函数),包就是包含(该内部函数对外部作用域而非全局作用

Beaglebone Back学习五(PWM测试)

PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2Using PWM on the Beaglebone Black 3 Beaglebone Coding 101: Buttons and PWM 4 Using PWM outputs 5 beaglebone-black-cpp-PWM 6 Enabling PWM Support in the kernel 7 Beaglebone Back学习五(PWM测试

TweenMax动画库学习(五)

目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            TweenMax动画库学习(四)            TweenMax动画库学习(五)  

学习Wireshark之一:基本用法

什么是Wireshark Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据包,并为用户提供关于网络和上层协议的各种信息,并尝试显示包尽可能详细的情况.与很多其他网络工具一样,Wireshark 也使用pcap network library来进行封包捕捉.Wireshark可能算得上是今天能使用的最好的开源网络分析软件. Wireshark的前身叫做Ethereal(因为商标问题而改名),是开放源代码软件,我们可以免费从官方网站(http://wireshark