国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C# - 如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

2022-03-01 14:18省厓 C#

Dapper類是一個(gè)開源的數(shù)據(jù)庫操作類,下面這篇文章主要給大家介紹了關(guān)于如何使用Dapper處理多個(gè)結(jié)果集與多重映射的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

對(duì)象關(guān)系映射(orm)已經(jīng)被使用了很長(zhǎng)時(shí)間,以解決在編程過程中對(duì)象模型與數(shù)據(jù)模型在關(guān)系數(shù)據(jù)庫中不匹配的問題。

dapper是由stack overflow團(tuán)隊(duì)開發(fā)的開源的,輕量級(jí)的orm.相比于其他的orm框架,dapper速度非常快。

dapper的設(shè)計(jì)考慮到了性能以及易用性。它支持使用事務(wù),存儲(chǔ)過程或數(shù)據(jù)批量插入的靜態(tài)和動(dòng)態(tài)對(duì)象綁定。

在本文中,我們將介紹如何使用dapper從單個(gè)數(shù)據(jù)庫調(diào)用中讀取數(shù)據(jù)庫中的多個(gè)結(jié)果集。我們將看看我們可能希望這樣做的場(chǎng)景,以及如何使用它的query和querymultiple方法更簡(jiǎn)潔地實(shí)現(xiàn)這一點(diǎn)。 當(dāng)我們談?wù)撘詳?shù)據(jù)為中心的應(yīng)用程序時(shí),可能會(huì)出現(xiàn)一些場(chǎng)景,在這些場(chǎng)景中我們可能希望從數(shù)據(jù)庫中檢索多重結(jié)果。多個(gè)結(jié)果集既可以是相關(guān)的,也可以是無關(guān)的。要做到這一點(diǎn),我們不需要對(duì)數(shù)據(jù)庫進(jìn)行多次往返,而是可以在一次數(shù)據(jù)庫調(diào)用本身中實(shí)際使用dapper檢索結(jié)果,然后將結(jié)果映射到代碼中的所需對(duì)象。

在我們繼續(xù)并開始研究如何做到這一點(diǎn)之前,讓我們首先試著理解在我們的應(yīng)用程序中可能希望做到這一點(diǎn)的場(chǎng)景:

1、查詢無關(guān)實(shí)體:所請(qǐng)求的實(shí)體根本不相關(guān)。

2、查詢具有1至多個(gè)關(guān)系的相關(guān)實(shí)體:被請(qǐng)求的實(shí)體具有1對(duì)多的關(guān)系,我們需要在代碼中處理多個(gè)結(jié)果集

3、查詢具有1至1關(guān)系的相關(guān)實(shí)體:被請(qǐng)求的實(shí)體具有1-1關(guān)系,我們需要在代碼中執(zhí)行處理多個(gè)映射 在第一個(gè)場(chǎng)景中,我們有完全不相關(guān)的實(shí)體,因此基本上,我們只想執(zhí)行兩個(gè)獨(dú)立的查詢來檢索數(shù)據(jù),然后將其映射到這些實(shí)體。在第二個(gè)場(chǎng)景中,返回的實(shí)體與1-多相關(guān),因此我們希望檢索數(shù)據(jù),然后將結(jié)果映射到具有1至多個(gè)關(guān)系的poco中。

最后,在第三個(gè)場(chǎng)景中,返回的實(shí)體是1-1,因此我們希望檢索數(shù)據(jù),然后將結(jié)果映射到具有1-1關(guān)系的poco中。 現(xiàn)在讓我們看看一些代碼,了解如何使用dapper來實(shí)現(xiàn)這一切。 所有這些都可以通過dapper的查詢、querymultiple和read方法進(jìn)行歸檔?,F(xiàn)在讓我們把重點(diǎn)放在如何在代碼中執(zhí)行這些操作。

查詢無關(guān)實(shí)體

假設(shè)我們想從api中檢索書籍和視頻列表。我們可以通過兩個(gè)簡(jiǎn)單的選擇所有查詢來實(shí)現(xiàn)這一點(diǎn),數(shù)據(jù)庫結(jié)果看起來如

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

現(xiàn)在,為了能夠從代碼中執(zhí)行同樣的操作,我們首先需要定義我們的實(shí)體:

?
1
2
3
4
5
6
7
8
9
10
11
12
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; }
}

使用這些模型,讓我們看看如何只使用一個(gè)數(shù)據(jù)庫調(diào)用來使用dapper檢索這些結(jié)果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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});
}

現(xiàn)在讓我們?cè)趐ostman中運(yùn)行,以查看行動(dòng)中的結(jié)果:

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

注意:我已經(jīng)創(chuàng)建了一個(gè)簡(jiǎn)單的api控制器來測(cè)試這個(gè)代碼,所有的db訪問代碼都在里面運(yùn)行。這只是為了演示目的和現(xiàn)實(shí)世界的應(yīng)用,這樣的代碼根本不應(yīng)該被使用。

查詢具有1到多關(guān)系的查詢相關(guān)實(shí)體

檢索相關(guān)實(shí)體的另一個(gè)典型場(chǎng)景是實(shí)體之間存在一對(duì)多關(guān)系。讓我們嘗試使用組織和聯(lián)系人的例子來可視化這一點(diǎn)。組織通常具有與其關(guān)聯(lián)的多個(gè)聯(lián)系人。如果我們想要檢索一個(gè)組織,并且想要檢索所有關(guān)聯(lián)的聯(lián)系人,我們可以利用querymultiple來做到這一點(diǎn)。這就是關(guān)系在數(shù)據(jù)庫中的樣子。

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

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

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

現(xiàn)在,如果我們必須在代碼中做同樣的事情,我們首先需要定義我們的實(shí)體。請(qǐng)注意,我們的實(shí)體也將建模一對(duì)多關(guān)系的方式,每個(gè)組織有一個(gè)聯(lián)系人列表。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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>

現(xiàn)在讓我們看一下用于檢索這些相關(guān)實(shí)體的代碼,并了解如何用dapper的querymultiple方法填充與1到多個(gè)關(guān)系相關(guān)的實(shí)體。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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);
}

在上面的代碼中,我們可以看到我們是如何同時(shí)執(zhí)行2個(gè)查詢的。我們接受了第一個(gè)查詢結(jié)果并填充了我們的組織對(duì)象。第二個(gè)查詢結(jié)果作為同一個(gè)組織對(duì)象的聯(lián)系人集合被推送。

現(xiàn)在讓我們?cè)趐ostman中運(yùn)行,以查看行動(dòng)中的結(jié)果:

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

具有1到1關(guān)系的查詢相關(guān)實(shí)體

前兩個(gè)場(chǎng)景非常簡(jiǎn)單,因?yàn)樗鼈円笪覀兙帉憙蓚€(gè)獨(dú)立的查詢,然后獨(dú)立收集每個(gè)查詢的結(jié)果,以便根據(jù)需要?jiǎng)?chuàng)建模型對(duì)象。

但是有1到1個(gè)關(guān)系的場(chǎng)景是很棘手的。從數(shù)據(jù)庫的角度來看,我們可以在單個(gè)sql查詢本身中檢索相關(guān)實(shí)體,但是隨后我們希望將單個(gè)結(jié)果集映射到代碼中的多個(gè)對(duì)象中。這可以使用在dapper中可用的多重映射特征來完成。讓我們?cè)谝粋€(gè)例子的幫助下理解這一點(diǎn)。

注意:我們?nèi)匀豢梢允褂门c1到許多關(guān)系相同的方法來檢索與1到1相關(guān)的數(shù)據(jù),但是本節(jié)將展示如何使用單個(gè)sql并映射結(jié)果。

讓我們舉一個(gè)聯(lián)系和護(hù)照的例子。每個(gè)聯(lián)系人只能有一個(gè)護(hù)照。讓我們先想象一下這個(gè)數(shù)據(jù)庫關(guān)系。

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

現(xiàn)在,讓我們看看是否需要從數(shù)據(jù)庫中檢索聯(lián)系人列表及其護(hù)照信息,我們?nèi)绾斡胹ql實(shí)現(xiàn)這一點(diǎn)。

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

現(xiàn)在讓我們看看我們的實(shí)體如何尋找聯(lián)系和護(hù)照。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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; }
}

現(xiàn)在讓我們看看如何從數(shù)據(jù)庫中檢索這些相關(guān)實(shí)體,并使用更簡(jiǎn)潔的多重映射完整地填充具有相同關(guān)系的pocos。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[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;
}

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

因此,在我們的查詢中,我們希望將結(jié)果映射到類型contact和passsport,然后期望結(jié)果返回到類型contact的對(duì)象中。

現(xiàn)在,讓我們看看在查詢方法中傳遞的實(shí)際參數(shù)。

第一個(gè)參數(shù)是sql查詢本身。

第二個(gè)參數(shù)是映射函數(shù),它將獲取結(jié)果,將它綁定到相應(yīng)的類型,然后創(chuàng)建所需的返回類型并返回該返回類型。在我們的代碼中,它采用contact和passport類型,并將contact的passport屬性指定為正在傳遞的passport值。一旦這樣做,結(jié)果接觸類型返回。

第三個(gè)參數(shù)是命令參數(shù)@ id。

最后一個(gè)參數(shù)拆分是將告訴dapper哪些列必須映射到下一個(gè)對(duì)象的列名。在我們的示例中,我們將此值作為passportid傳遞,這意味著在找到passportid列之前,所有列都將映射到第一種類型,即contact,然后隨后的列將被映射到下一個(gè)參數(shù)類型,即passport。

注意:如果我們有2個(gè)以上的對(duì)象需要映射,spliton將是一個(gè)逗號(hào)分隔的列表,其中每個(gè)列名將充當(dāng)分隔符,并開始下一個(gè)對(duì)象類型的映射列。

現(xiàn)在讓我們?cè)趐ostman中運(yùn)行,以查看行動(dòng)中的結(jié)果:

如何使用Dapper處理多個(gè)結(jié)果集與多重映射實(shí)例教程

歐了,我們使用dapper從數(shù)據(jù)庫中檢索多個(gè)結(jié)果集,以避免數(shù)據(jù)庫往返。

總結(jié):

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

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://www.cnblogs.com/shengya/p/9671932.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费一级黄 | jyzz中国jizz十八岁免费 | 成人欧美一区二区 | 毛片激情永久免费 | 久久国产电影 | 91久久夜色精品国产网站 | 在线日韩| 欧美 国产精品 | 欧美视频免费 | 久久久精品在线 | 69久久| 毛片xxx | 91偷拍精品一区二区三区 | 欧美激情视频一区二区三区在线播放 | 希岛爱理在线 | 草久在线观看 | 在线99 | 婷婷在线免费视频 | 黄色免费视频 | 中国一级毛片 | 欧美a级成人淫片免费看 | 日韩成人精品在线 | 看污片网站 | 欧洲一区 | 欧美淫片| 国产精品免费观看 | 亚洲欧美精选 | 国产精品无码永久免费888 | av大片| 久色网| 中文字幕一区二区三区在线视频 | 欧洲免费视频 | 久久久精品影院 | 日韩一区二区在线观看 | 婷婷色综合 | 国产不卡一区 | 免费欧美一级 | 久久久女女女女999久久 | 欧美成视频 | 精品日韩一区二区 | 成人动慢 |