亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

如何使用Dapper處理多個結果集與多重映射實例教程

2019-10-29 19:59:08
字體:
來源:轉載
供稿:網友

前言

對象關系映射(ORM)已經被使用了很長時間,以解決在編程過程中對象模型與數據模型在關系數據庫中不匹配的問題。

Dapper是由Stack OverFlow團隊開發的開源的,輕量級的ORM.相比于其他的ORM框架,Dapper速度非??臁?/p>

Dapper的設計考慮到了性能以及易用性。它支持使用事務,存儲過程或數據批量插入的靜態和動態對象綁定。

在本文中,我們將介紹如何使用DAPPER從單個數據庫調用中讀取數據庫中的多個結果集。我們將看看我們可能希望這樣做的場景,以及如何使用它的Query和QueryMultiple方法更簡潔地實現這一點。 當我們談論以數據為中心的應用程序時,可能會出現一些場景,在這些場景中我們可能希望從數據庫中檢索多重結果。多個結果集既可以是相關的,也可以是無關的。要做到這一點,我們不需要對數據庫進行多次往返,而是可以在一次數據庫調用本身中實際使用dapper檢索結果,然后將結果映射到代碼中的所需對象。

在我們繼續并開始研究如何做到這一點之前,讓我們首先試著理解在我們的應用程序中可能希望做到這一點的場景:

1、查詢無關實體:所請求的實體根本不相關。

2、查詢具有1至多個關系的相關實體:被請求的實體具有1對多的關系,我們需要在代碼中處理多個結果集

3、查詢具有1至1關系的相關實體:被請求的實體具有1-1關系,我們需要在代碼中執行處理多個映射 在第一個場景中,我們有完全不相關的實體,因此基本上,我們只想執行兩個獨立的查詢來檢索數據,然后將其映射到這些實體。在第二個場景中,返回的實體與1-多相關,因此我們希望檢索數據,然后將結果映射到具有1至多個關系的POCO中。

最后,在第三個場景中,返回的實體是1-1,因此我們希望檢索數據,然后將結果映射到具有1-1關系的POCO中。 現在讓我們看看一些代碼,了解如何使用Dapper來實現這一切。 所有這些都可以通過DAPPER的查詢、QueryMultiple和Read方法進行歸檔?,F在讓我們把重點放在如何在代碼中執行這些操作。

查詢無關實體

假設我們想從API中檢索書籍和視頻列表。我們可以通過兩個簡單的選擇所有查詢來實現這一點,數據庫結果看起來如

Dapper,結果集,多重映射

現在,為了能夠從代碼中執行同樣的操作,我們首先需要定義我們的實體:

public class Book{ public int ID { get; set; } public string BookName { get; set;} public string ISBN { get; set; }}public class Video{ public int ID { get; set; } public string VideoName { get; set; }}

使用這些模型,讓我們看看如何只使用一個數據庫調用來使用DAPPER檢索這些結果:

public IActionResult Index(){ // define our SQL query - it contains mulitple queries seprated by ; var query = "SELECT * from Books; Select * from Videos"; // Execute the query var results = dbConnection.QueryMultiple(query); // retrieve the results into the respective models var books = results.Read<Book>(); var videos = results.Read<Video>(); return Ok(new { Books = books, Videos = videos});}

現在讓我們在POSTMAN中運行,以查看行動中的結果:

Dapper,結果集,多重映射

注意:我已經創建了一個簡單的API控制器來測試這個代碼,所有的DB訪問代碼都在里面運行。這只是為了演示目的和現實世界的應用,這樣的代碼根本不應該被使用。

查詢具有1到多關系的查詢相關實體

檢索相關實體的另一個典型場景是實體之間存在一對多關系。讓我們嘗試使用組織和聯系人的例子來可視化這一點。組織通常具有與其關聯的多個聯系人。如果我們想要檢索一個組織,并且想要檢索所有關聯的聯系人,我們可以利用QueryMultiple來做到這一點。這就是關系在數據庫中的樣子。

Dapper,結果集,多重映射

首先讓我們檢查一下如何使用SQL查詢做同樣的操作。

Dapper,結果集,多重映射

現在,如果我們必須在代碼中做同樣的事情,我們首先需要定義我們的實體。請注意,我們的實體也將建模一對多關系的方式,每個組織有一個聯系人列表。

public class Organization{ public int ID { get; set; } public string OrganizationName { get; set; } public List<contact> Contacts { get; set; }}public class Contact{ public int ID { get; set; } public int OrganizationId { get; set; } public string ContactName { get; set; }}</contact>

現在讓我們看一下用于檢索這些相關實體的代碼,并了解如何用dapper的QueryMultiple方法填充與1到多個關系相關的實體。

[HttpGet("{id}")]public IActionResult GetOrganization(int id){ // define our SQL query - it contains mulitple queries seprated by ; var query = @"SELECT* from Organizations where id = @id;    Select * from Contacts where OrganizationId = @id"; // Execute the query var results = dbConnection.QueryMultiple(query, new { @id = id }); // retrieve the results into the respective models var org = results.ReadSingle<Organization>(); org.Contacts = results.Read<Contact>().ToList(); return Ok(org);}

在上面的代碼中,我們可以看到我們是如何同時執行2個查詢的。我們接受了第一個查詢結果并填充了我們的組織對象。第二個查詢結果作為同一個組織對象的聯系人集合被推送。

現在讓我們在POSTMAN中運行,以查看行動中的結果:

Dapper,結果集,多重映射

具有1到1關系的查詢相關實體

前兩個場景非常簡單,因為它們要求我們編寫兩個獨立的查詢,然后獨立收集每個查詢的結果,以便根據需要創建模型對象。

但是有1到1個關系的場景是很棘手的。從數據庫的角度來看,我們可以在單個SQL查詢本身中檢索相關實體,但是隨后我們希望將單個結果集映射到代碼中的多個對象中。這可以使用在DAPPER中可用的多重映射特征來完成。讓我們在一個例子的幫助下理解這一點。

注意:我們仍然可以使用與1到許多關系相同的方法來檢索與1到1相關的數據,但是本節將展示如何使用單個SQL并映射結果。

讓我們舉一個聯系和護照的例子。每個聯系人只能有一個護照。讓我們先想象一下這個數據庫關系。

Dapper,結果集,多重映射

現在,讓我們看看是否需要從數據庫中檢索聯系人列表及其護照信息,我們如何用SQL實現這一點。

Dapper,結果集,多重映射

現在讓我們看看我們的實體如何尋找聯系和護照。

public class Contact{ public int ID { get; set; } public int OrganizationId { get; set; } public string ContactName { get; set; } public Passport Passport { get; set; }}public class Passport{ public int ID { get; set; } public int Contactid { get; set; } public string PassportNumber { get; set; }}

現在讓我們看看如何從數據庫中檢索這些相關實體,并使用更簡潔的多重映射完整地填充具有相同關系的POCOs。

[HttpGet("{id}")]public IActionResult GetContact(int id){ var query = @"Select    c.ID, c.Organizationid, c.ContactName,    p.ID as PassPortId, p.ContactId, p.PassportNumber    from Contacts c,    Passports p    where c.ID = p.ContactID    and c.id = @id"; // Execute the query var contact = dbConnection.Query<Contact, Passport, Contact>(query, MapResults, new { @id = id }, splitOn: "PassportId"); return Ok(contact);}private Contact MapResults(Contact contact, Passport passport){ contact.Passport = passport; return contact;}

在上面的代碼中,我們使用的是查詢方法的重載版本,它采用多個類型。傳遞的類型是我們要映射的每個對象的類型參數,最后一個類型參數是表示該查詢將返回的對象類型的附加參數。

因此,在我們的查詢中,我們希望將結果映射到類型Contact和Passsport,然后期望結果返回到類型Contact的對象中。

現在,讓我們看看在查詢方法中傳遞的實際參數。

第一個參數是SQL查詢本身。

第二個參數是映射函數,它將獲取結果,將它綁定到相應的類型,然后創建所需的返回類型并返回該返回類型。在我們的代碼中,它采用Contact和Passport類型,并將Contact的Passport屬性指定為正在傳遞的Passport值。一旦這樣做,結果接觸類型返回。

第三個參數是命令參數@ id。

最后一個參數拆分是將告訴DAPPER哪些列必須映射到下一個對象的列名。在我們的示例中,我們將此值作為PassportId傳遞,這意味著在找到PassportId列之前,所有列都將映射到第一種類型,即Contact,然后隨后的列將被映射到下一個參數類型,即Passport。

注意:如果我們有2個以上的對象需要映射,splitOn將是一個逗號分隔的列表,其中每個列名將充當分隔符,并開始下一個對象類型的映射列。

現在讓我們在POSTMAN中運行,以查看行動中的結果:

Dapper,結果集,多重映射

歐了,我們使用DAPPER從數據庫中檢索多個結果集,以避免數據庫往返。

總結:

在本文中,我們討論了如何使用dapper提供的特性在一次運行中檢索多個相關或無關的實體,從而避免多次數據庫往返。這是從初學者的角度寫的。我希望這有一定的信息性。

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久成人精品| 国产精品国产自产拍高清av水多| 亚洲一区亚洲二区亚洲三区| 精品久久久久久亚洲精品| 亚洲天堂第一页| 中文字幕亚洲综合久久| 日韩久久精品电影| 92福利视频午夜1000合集在线观看| 中文字幕精品网| 亚洲精美色品网站| 亚洲韩国青草视频| 日韩中文字幕av| www.国产一区| 亚洲国产精品va在线看黑人动漫| 91日韩在线播放| 亚洲欧美成人在线| 国产成人免费91av在线| 日韩精品极品在线观看播放免费视频| 亚洲第一在线视频| 欧美成人三级视频网站| 欧美国产日韩一区| 日韩久久免费视频| 日韩av在线免费看| 成人日韩av在线| 日韩国产欧美精品在线| 亚洲大尺度美女在线| 97在线免费观看| 91精品久久久久久久久中文字幕| 成人av在线亚洲| 成人激情电影一区二区| 亚洲一区二区免费在线| 欧美成人午夜免费视在线看片| 国产精品免费一区| 欧美亚洲一区在线| 久久99精品久久久久久噜噜| 国产ts一区二区| 国产一区二区香蕉| 国色天香2019中文字幕在线观看| 久久精品成人欧美大片古装| 91青草视频久久| 成人性生交大片免费观看嘿嘿视频| 日韩高清a**址| 91情侣偷在线精品国产| 在线视频日本亚洲性| 亚洲午夜av久久乱码| 一区二区三欧美| 久久精品中文字幕一区| 欧美日韩在线观看视频小说| 亚洲免费高清视频| 欧美成人精品不卡视频在线观看| 亚洲成av人影院在线观看| 日韩免费在线观看视频| 欧美黑人性视频| 国产日产久久高清欧美一区| 亚洲国内精品在线| 久久久视频在线| 国产欧美日韩免费看aⅴ视频| 91爱视频在线| 国产精品一区二区三区免费视频| 欧美高清激情视频| 一色桃子一区二区| 亚洲精品国产美女| 亚洲国产女人aaa毛片在线| 国产欧美精品久久久| 欧美巨大黑人极品精男| 在线播放国产一区中文字幕剧情欧美| 91久久国产精品| 一本大道久久加勒比香蕉| 日韩欧美国产高清91| 欧美视频在线视频| 亚洲欧美三级伦理| 日本精品一区二区三区在线播放视频| 国产丝袜一区二区三区免费视频| 欧美一区二区大胆人体摄影专业网站| 国产精品99蜜臀久久不卡二区| 国产精品色悠悠| 九九视频直播综合网| 国产欧美久久一区二区| 亚洲成人国产精品| 国产91精品久久久久| 日韩中文字幕久久| 日韩中文字在线| 国产精品久久久久久av下载红粉| 久久久www成人免费精品| 狠狠久久五月精品中文字幕| 久久久999精品免费| 中国日韩欧美久久久久久久久| 久久久在线观看| 国产一区二区三区网站| 一二美女精品欧洲| 欧美性猛交xxxx免费看漫画| 日韩一区二区福利| 亚洲精品少妇网址| 国产精品网站入口| 日韩毛片在线看| 欧美日韩国产黄| 亚洲最新av在线网站| 日韩欧美在线观看视频| 热久久视久久精品18亚洲精品| 91久久精品一区| 在线电影欧美日韩一区二区私密| 欧美在线www| 亚洲成人黄色在线| 2018中文字幕一区二区三区| 亚洲国产精品久久91精品| 亚洲a∨日韩av高清在线观看| 78m国产成人精品视频| www.国产一区| 久久精品夜夜夜夜夜久久| 国产精品国产三级国产aⅴ9色| 97在线看福利| 热门国产精品亚洲第一区在线| 色偷偷9999www| 91免费视频国产| 97精品久久久中文字幕免费| 国产精品高清网站| 国产91色在线播放| 亚洲综合中文字幕68页| 成人免费网站在线看| 国产一区二区丝袜| 亚洲www视频| 欧美亚洲激情在线| 欧美孕妇孕交黑巨大网站| 日韩欧美中文字幕在线播放| 日韩在线精品一区| 亚洲四色影视在线观看| 深夜福利国产精品| 亚洲免费伊人电影在线观看av| 亚洲欧美一区二区三区在线| 亚洲最大av网站| 日韩精品视频免费| 伊人久久免费视频| 欧美高清一级大片| 国产精品偷伦视频免费观看国产| 亚洲人成电影网站色…| 国产婷婷成人久久av免费高清| 欧美野外wwwxxx| 欧美日韩国产色| 国产精品黄色影片导航在线观看| 久久久精品久久久| 日韩中文字幕国产| 91精品国产91久久久久久不卡| 亚洲性日韩精品一区二区| 97精品视频在线| 亚洲精品成人av| 亚洲色图综合网| 精品久久久av| 日韩精品视频三区| 国产欧美韩国高清| 亚洲国产欧美在线成人app| 亚洲天堂免费观看| 亚洲成人免费在线视频| 精品国产一区二区三区久久| 欧美激情啊啊啊| 成人国内精品久久久久一区| 日韩精品欧美国产精品忘忧草| 亚洲综合中文字幕在线| 亚洲精品久久在线| 欧美一级大片在线免费观看| 91精品国产综合久久男男| 亚洲图片在区色| 欧美激情视频一区二区三区不卡| 国产综合在线视频| 欧美日韩国产影院|