Dapper笔记-Query、Execute

介绍

Dapper是一个用于.NET的简单的对象映射,并且在速度上有着轻ORM之王的称号。
Dapper扩展IDbConnection,提供有用的扩展方法来查询数据库。
原生Dapper主要有两个扩展方法Execute、Query。
Execute用来执行增删改sql,以及存储过程
Query用来执行查询操作
Github:https://github.com/StackExchange/Dapper

Dapper案例

插入单行


            using (var connection = GetConnection())
            {
                string sql = "INSERT INTO Order_item(ID,OrderID) VALUES(@ID,@OrderID)";
                Order_item orderItem = new Order_item { ID = 10000, OrderID = 1000 };
                connection.Execute(sql, orderItem);
            }

插入多行

            using (var connection = GetConnection())
            {
                string sql = "INSERT INTO Order_item(ID,OrderID) VALUES(@ID,@OrderID)";
                Order_item[] orderItems =new Order_item[] {
                    new Order_item { ID = 10001, OrderID = 1000 },
                    new Order_item { ID = 10002, OrderID = 1000 },
                };
                connection.Execute(sql, orderItems);
            }

普通查询

            using (var connection = GetConnection())
            {
                string sql = "SELECT * FROM Order_item ORDER BY ID DESC LIMIT 10";
                var orderItemList = connection.Query<Order_item>(sql);
            }

IN查询

using (SqlConnection conn = new SqlConnection(connStr))
{
    string sqlStr = @"select A.Id,A.Title,S.SeoKeywords from Article A where A.Id in @ids";
    conn.Open();
    var articleList = conn.Query(sqlStr, new { ids = new int[] { 41, 42, 43, 44, 45, 46, 47, 48 } });
    foreach (var item in articleList)
    {
        Console.WriteLine(item.Id + " | " + item.SeoKeywords + " | :" + item.Title);
    }
}

查询映射1

            using (var connection = GetConnection())
            {
                string sql = "select u.id,u.email,a.FirstName,a.LastName from user_info u inner join user_address a  on a.userid = u.id order by id desc limit 10";
                var orderItemList = connection.Query<User_info, User_address, User_info>(sql, (userInfo, userAddress) =>
                {
                    userInfo.Address = userAddress;
                    return userInfo;
                }, splitOn: "firstname");//运行时,会从查询结果所有字段列表的最后一个字段开始进行匹配,一直到找到UserName这个字段(大小写忽略无所谓)

            }

查询映射2

            using (var connection = GetConnection())
            {
                
                string sql = "select u.id,u.email,a.FirstName,a.LastName from user_info u inner join user_address a  on a.userid = u.id order by id desc limit 10";
                using (var reader = connection.ExecuteReader(sql))
                {
                    var userInfoParser = reader.GetRowParser<User_info>();
                    var userAddressParser = reader.GetRowParser<User_address>();
                    while (reader.Read())
                    {
                       var userInfo = userInfoParser(reader);
                        userInfo.Address = userAddressParser(reader);
                    }
                    
                }

            }

多结果集

using (SqlConnection conn = new SqlConnection(connStr))
{
    string sqlStr = @"select Id,Title,Author from Article where Id = @id
                      select * from QQModel where Name = @name
                      select * from SeoTKD where Status = @status";
    using (var multi = conn.QueryMultiple(sqlStr, new { id = 11, name = "打代码", status = 99 }))
    {
        //multi.IsConsumed   reader的状态 ,true 是已经释放
        if (!multi.IsConsumed)
        {
            //注意一个东西,Read获取的时候必须是按照上面返回表的顺序 (article,qqmodel,seotkd)
            //强类型
            var articleList = multi.Read<Temp>();//类不见得一定得和表名相同
            var QQModelList = multi.Read<QQModel>();
            var SeoTKDList = multi.Read<SeoTKD>();
 
            //动态类型
            //var articleList = multi.Read();
            //var QQModelList = multi.Read();
            //var SeoTKDList = multi.Read();
        }
 
    }
}

参考:
https://www.cnblogs.com/Vincent-yuan/p/11504004.html
https://www.cnblogs.com/nontracey/p/9988759.html(DapperExtensions.NetCore 待学习!!)

原文地址:https://www.cnblogs.com/fanfan-90/p/13578111.html