有时,您要映射的类型数超过了进行构造的Func <>提供的7种类型。
而不是Query<>与泛型类型参数输入一起使用,我们将提供要映射为数组的类型,然后是映射函数。除了初始手动设置和值的转换外,其余功能均不会更改。
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>(sql, new[] { typeof(Person), typeof(Country), typeof(Book) } , obj => { Person person = obj[0] as Person; Country country = obj[1] as Country; Book book = obj[2] as 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");