使用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中檢索書籍和視訊列表。我們可以通過兩個簡單的選擇所有查詢來實現這一點,資料庫結果看起來如下:
現在,為了能夠從程式碼中執行同樣的操作,我們首先需要定義我們的實體:
1 public class Book 2 { 3public int ID { get; set; } 4public string BookName { get; set;} 5public string ISBN { get; set; } 6 } 7 8 public class Video 9 { 10public int ID { get; set; } 11public string VideoName { get; set; } 12 }
使用這些模型,讓我們看看如何只使用一個數據庫呼叫來使用DAPPER檢索這些結果:
1 public IActionResult Index() 2 { 3// define our SQL query - it contains mulitple queries seprated by ; 4var query = "SELECT * from Books; Select * from Videos"; 5 6// Execute the query 7var results = dbConnection.QueryMultiple(query); 8 9// retrieve the results into the respective models 10var books = results.Read<Book>(); 11var videos = results.Read<Video>(); 12 13return Ok(new { Books = books, Videos = videos}); 14 }
現在讓我們在POSTMAN中執行,以檢視行動中的結果:
注意:我已經建立了一個簡單的API控制器來測試這個程式碼,所有的DB訪問程式碼都在裡面執行。這只是為了演示目的和現實世界的應用,這樣的程式碼根本不應該被使用。
查詢具有1到多關係的查詢相關實體
檢索相關實體的另一個典型場景是實體之間存在一對多關係。讓我們嘗試使用組織和聯絡人的例子來視覺化這一點。組織通常具有與其關聯的多個聯絡人。如果我們想要檢索一個組織,並且想要檢索所有關聯的聯絡人,我們可以利用QueryMultiple來做到這一點。這就是關係在資料庫中的樣子。
首先讓我們檢查一下如何使用SQL查詢做同樣的操作。
現在,如果我們必須在程式碼中做同樣的事情,我們首先需要定義我們的實體。請注意,我們的實體也將建模一對多關係的方式,每個組織有一個聯絡人列表。
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中執行,以檢視行動中的結果:
具有1到1關係的查詢相關實體
前兩個場景非常簡單,因為它們要求我們編寫兩個獨立的查詢,然後獨立收集每個查詢的結果,以便根據需要建立模型物件。
但是有1到1個關係的場景是很棘手的。從資料庫的角度來看,我們可以在單個SQL查詢本身中檢索相關實體,但是隨後我們希望將單個結果集對映到程式碼中的多個物件中。這可以使用在DAPPER中可用的多重對映特徵來完成。讓我們在一個例子的幫助下理解這一點。
注意:我們仍然可以使用與1到許多關係相同的方法來檢索與1到1相關的資料,但是本節將展示如何使用單個SQL並對映結果。
讓我們舉一個聯絡和護照的例子。每個聯絡人只能有一個護照。讓我們先想象一下這個資料庫關係。
總結:
在本文中,我們討論瞭如何使用dapper提供的特性在一次執行中檢索多個相關或無關的實體,從而避免多次資料庫往返。這是從初學者的角度寫的。我希望這有一定的資訊性。