一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - C# - 如何使用Dapper處理多個結果集與多重映射實例教程

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

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

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

前言

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

dapper是由stack overflow團隊開發的開源的,輕量級的orm.相比于其他的orm框架,dapper速度非常快。

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方法進行歸檔。現在讓我們把重點放在如何在代碼中執行這些操作。

查詢無關實體

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

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

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

?
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; }
}

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

?
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});
}

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

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

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

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

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

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

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

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

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

?
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>

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

?
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);
}

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

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

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

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

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

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

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

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

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

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

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

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

?
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; }
}

現在讓我們看看如何從數據庫中檢索這些相關實體,并使用更簡潔的多重映射完整地填充具有相同關系的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;
}

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

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

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

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

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

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

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

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

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

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

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

總結:

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

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

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

延伸 · 閱讀

精彩推薦
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
主站蜘蛛池模板: 草草在线影院 | 午夜欧美精品久久久久久久 | 日本高清二三四本2021 | 欧美日韩国产亚洲一区二区三区 | 99热这里只有精品一区二区三区 | 国产清纯91天堂在线观看 | 国产九九热视频 | 丝袜捆绑调教丨vk | 国产成人精品免费视频大全五级 | 奇米影视77777 | 国产在线精品99一卡2卡 | 视频二区 素人 欧美 日韩 | 国产草逼视频 | 男人捅女人动漫 | 国产资源中文字幕 | 大ji巴好好爽好深网站 | 性趣味商品推荐 | 成人亚洲欧美日韩中文字幕 | 成人福利在线播放 | 亚洲精品一区二区久久这里 | 婷婷精品进入 | 国产精品乱码高清在线观看 | 亚洲精品久久久打桩机 | 欧洲美女人牲交一级毛片 | 免费看美女被靠到爽 | 精品久久成人免费第三区 | 欧美精品久久久亚洲 | 女人是男人的未来1分49分 | 免费十几分视频 | 华人亚洲欧美精品国产 | 91香蕉导航| 肥胖女人一级毛片 | mm在线| 亚洲色域网 | 欧美专区视频 | 91天堂一区二区 | 日韩精品一区二区 | 亚洲天堂视频在线观看免费 | 精品久久久久久久久久久久久久久 | 四虎在线精品免费高清在线 | 亚洲欧美日韩国产精品影院 |