码迷,mamicode.com
首页 > 移动开发 > 详细

关于数据库表格,Dapped怎么实现一对多的调用,和数据的无线存储

时间:2020-12-29 11:20:21      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:五个   string   src   enc   一对多   add   default   源码   逻辑   

一对一和一对多,使用书本、作者、书签 作为示例: 一本书只有一个作者,并且有多条书签

实体类:

技术图片
    public class BookMark
    {
        public int Id { get; set; }

        public int BookId { get; set; }

        public virtual string Content { get; set; }
    }
技术图片
技术图片
    public class Book
    {
        public Book()
        {
            Marks = new List<BookMark>();
        }
        public int Id { get; set; }

        public string Name { get; set; }

        public Author Author { get; set; }

        public virtual List<BookReview> Marks { get; set; }

    }
技术图片
技术图片
    public class Author
    {
        public int Id { get; set; }

        public string Name { get; set; }

     public string BookId { get; set; } }
技术图片

关联查询的方法

先查看一下Dapper的源码,SqlMapper类;  使用这类的泛型方法:

技术图片

 

 

可以看出SqlMapper类对IDbConnection做出了拓展方法,并针对不同的关联数量实现了不同的重载方法。

其中First、 Second、 Third.........等等泛型参数代表需要关联的对象。可以看出最多可以传入6个泛型参数,支持到TFifth, 也就是最多支持到关联五个表。

相对于单表查询,主要多了一个Func<>泛型内置委托,委托类型与方法泛型参数一致,映射对应关系的逻辑代码应该写在这个泛型委托中

一路f12就可以跟踪到这个委托最终调用的地方

技术图片

大致简单的知道了原理和流程,开始示例代码:

一对一关联

书本与作者一对一关联:

技术图片
        public Book GetEntity(string id)
        {
            using (Conn)
            {
                string query = "SELECT * FROM Book b INNER JOIN Author au ON au.BookId = b.Id WHERE b.id = @id";
                Book lookup = null;
                var b = Conn.Query<Book, Author, Book>(query,
                    (book, author) =>
                    {
                        if (author != null)
                            lookup.Author = author;
                        return lookup;
                    }, new { id = id }).Distinct().SingleOrDefault();
                return b;
            }
        }
技术图片

非常简单,直接在委托中赋值即可。

环球包网平台

一对多关联

书本与书签一对多关联:

技术图片
        public Book GetEntityWithRefence(string id)
        {
            using (Conn)
            {
                string query = "SELECT * FROM Book b LEFT JOIN BookMark bm ON bm.BookId = b.Id WHERE b.id = @id";
                Book lookup = null;
                var b = Conn.Query<Book, BookMark, Book>(query,
                    (book, bookMark) =>
                    {
                        if (lookup == null || lookup.Id != book.Id)
                            lookup = book;
                        if (bookMark != null)
                            lookup.Marks.Add(bookMark);
                        return lookup;
                    }, new { id = id }).Distinct().SingleOrDefault();
                return b;
            }
        }
技术图片

因为是IList, 所以使用Add的方式添加到主表。

多对多同一对多的写法

关于数据库表格,Dapped怎么实现一对多的调用,和数据的无线存储

标签:五个   string   src   enc   一对多   add   default   源码   逻辑   

原文地址:https://www.cnblogs.com/desheng9302/p/14178189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!