using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Dapper; using System.Data; using System.Data.SqlClient; using Newtonsoft.Json; namespace ConsoleApp2.test1 { public class Class5 { //原文:https://www.cnblogs.com/Sinte-Beuve/p/4231053.html // https://github.com/StackExchange/Dapper IDbConnection conn = new SqlConnection("data source=.\sqlexpress;initial catalog=MyDbContext;user id=sa;password=sa;"); //Insert public void test1() { string query = "INSERT INTO Book(Name)VALUES(@name)"; //对对象进行操作 Book book = new Book(); book.Name = "C"; conn.Execute(query, book); //直接赋值操作 conn.Execute(query, new { name = "C#" }); } //update public void test2() { string query = "UPDATE Book SET Name=@name WHERE id =@id"; Book book = new Book(); book.Id = 1; book.Name = "CC"; conn.Execute(query, book); } //delete public void test3() { string query = "DELETE FROM Book WHERE id = @id"; Book book = new Book(); book.Id = 1; conn.Execute(query, book); int id = 2; conn.Execute(query, new { id = id }); } //无参数查询,返回列表,带参数查询和之前的参数赋值法相同。 public void test4() { string query = "SELECT * FROM Book"; var list = conn.Query<Book>(query).ToList(); Console.WriteLine(JsonConvert.SerializeObject(list)); } //返回单条信息 public void test5() { string query = "SELECT * FROM Book WHERE id = @id"; int id = 4; var book = conn.Query<Book>(query, new { id = id }).SingleOrDefault(); Console.WriteLine(JsonConvert.SerializeObject(book)); } //查询:1--n public void test6() { int id = 3; //查询图书时,同时查找对应的书评,并存在List中。实现1--n的查询操作 string query = "SELECT * FROM Book b LEFT JOIN BookReview br ON br.BookId = b.Id WHERE b.id = @id"; Book lookup = null; //Query<TFirst, TSecond, TReturn> var b = conn.Query<Book, BookReview, Book>(query, (book, bookReview) => { //扫描第一条记录,判断非空和非重复 if (lookup == null || lookup.Id != book.Id) { lookup = book; } //书对应的书评非空,加入当前书的书评List中,最后把重复的书去掉。 if (bookReview != null) { lookup.Reviews.Add(bookReview); } return lookup; }, new { id = id }).Distinct().SingleOrDefault(); Console.WriteLine(JsonConvert.SerializeObject(b)); } //查询:1--1 public void test7() { int id = 3; BookReview br; //string query = "SELECT * FROM BookReview WHERE id = @id";//demo上的查询有误 string query = "SELECT * FROM BookReview br LEFT JOIN Book b ON b.Id = br.BookId WHERE br.Id = @id"; br = conn.Query<BookReview, Book, BookReview>(query, (bookReview, book) => { bookReview.AssoicationWithBook = book; return bookReview; }, new { id = id }, splitOn: "Content").SingleOrDefault();//}, new { id = id }, splitOn: "Content").SingleOrDefault(); Console.WriteLine(JsonConvert.SerializeObject(br)); } //事务 public void test8() { using (conn) { conn.Open();//demo又有问题,没有打开连接 IDbTransaction transaction = conn.BeginTransaction();//开始事务 try { int id = 3; string query = "DELETE FROM Book WHERE id = @id"; string query2 = "DELETE FROM BookReview WHERE BookId = @BookId"; conn.Execute(query2, new { BookId = id }, transaction, null, null);//注意这里的删除顺序,先删子表,再删主表 conn.Execute(query, new { id = id }, transaction, null, null); transaction.Commit();//提交事务 } catch (Exception ex) { //出现异常,事务Rollback transaction.Rollback(); throw new Exception(ex.Message); } } } } //书 public class Book { public Book() { Reviews = new List<BookReview>(); } public int Id { get; set; } public string Name { get; set; } public virtual List<BookReview> Reviews { get; set; } public override string ToString() { return string.Format("[{0}]------《{1}》", Id, Name); } } //书评 public class BookReview { public int Id { get; set; } public int BookId { get; set; } public virtual string Content { get; set; } public virtual Book AssoicationWithBook { get; set; } public override string ToString() { return string.Format("{0})--[{1}] "{3}"", Id, BookId, Content); } } }