一對多對映
讓我們看一個包含一對多關係的更復雜的例子。我們的查詢現在將包含多行包含重複資料,我們將需要處理此問題。我們通過在閉包中查詢來完成此操作。
查詢稍有變化,示例類也是如此。
ID |
名稱 | 天生 | CountryId | 國家的名字 | BOOKID | BOOKNAME |
---|---|---|---|---|---|---|
1 |
丹尼爾丹尼特 | 1942 年 | 1 | 美國 | 1 | 奇思妙想 |
1 |
丹尼爾丹尼特 | 1942 年 | 1 | 美國 | 2 | 肘室 |
2 |
山姆哈里斯 | 1967 年 | 1 | 美國 | 3 | 道德景觀 |
2 |
山姆哈里斯 | 1967 年 | 1 | 美國 | 4 | 醒來:沒有宗教的靈性指南 |
3 |
理查德道金斯 | 1941 年 | 2 | 英國 | 五 | 現實的魔力:我們如何知道什麼是真的 |
3 |
理查德道金斯 | 1941 年 | 2 | 英國 | 6 | 對神奇的渴望:科學家的創造 |
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Born { get; set; }
public Country Residience { get; set; }
public ICollection<Book> Books { get; set; }
}
public class Country
{
public int CountryId { get; set; }
public string CountryName { get; set; }
}
public class Book
{
public int BookId { get; set; }
public string BookName { get; set; }
}
dictionaryremainingHorsemen
將填充完全物化的人物物件例項。對於查詢結果的每一行,傳入 lambda 引數中定義的型別例項的對映值,由你決定如何處理。
var sql = @"SELECT 1 AS Id, 'Daniel Dennett' AS Name, 1942 AS Born, 1 AS CountryId, 'United States of America' AS CountryName, 1 AS BookId, 'Brainstorms' AS BookName
UNION ALL SELECT 1 AS Id, 'Daniel Dennett' AS Name, 1942 AS Born, 1 AS CountryId, 'United States of America' AS CountryName, 2 AS BookId, 'Elbow Room' AS BookName
UNION ALL SELECT 2 AS Id, 'Sam Harris' AS Name, 1967 AS Born, 1 AS CountryId, 'United States of America' AS CountryName, 3 AS BookId, 'The Moral Landscape' AS BookName
UNION ALL SELECT 2 AS Id, 'Sam Harris' AS Name, 1967 AS Born, 1 AS CountryId, 'United States of America' AS CountryName, 4 AS BookId, 'Waking Up: A Guide to Spirituality Without Religion' AS BookName
UNION ALL SELECT 3 AS Id, 'Richard Dawkins' AS Name, 1941 AS Born, 2 AS CountryId, 'United Kingdom' AS CountryName, 5 AS BookId, 'The Magic of Reality: How We Know What`s Really True' AS BookName
UNION ALL SELECT 3 AS Id, 'Richard Dawkins' AS Name, 1941 AS Born, 2 AS CountryId, 'United Kingdom' AS CountryName, 6 AS BookId, 'An Appetite for Wonder: The Making of a Scientist' AS BookName";
var remainingHorsemen = new Dictionary<int, Person>();
connection.Query<Person, Country, Book, Person>(sql, (person, country, book) => {
//person
Person personEntity;
//trip
if (!remainingHorsemen.TryGetValue(person.Id, out personEntity))
{
remainingHorsemen.Add(person.Id, personEntity = person);
}
//country
if(personEntity.Residience == null)
{
if (country == null)
{
country = new Country { CountryName = "" };
}
personEntity.Residience = country;
}
//books
if(personEntity.Books == null)
{
personEntity.Books = new List<Book>();
}
if (book != null)
{
if (!personEntity.Books.Any(x => x.BookId == book.BookId))
{
personEntity.Books.Add(book);
}
}
return personEntity;
},
splitOn: "CountryId,BookId");
請注意
splitOn
引數如何是下一個型別的第一列的逗號分隔列表。