Вариант 1:
Подход, который я использовал, заключается в загрузке каждого отношения по отдельности (для небольших N таблиц). Если у вас 8 таблиц, то 8 запросов предоставят все необходимые вам данные. Вот надуманный пример из 3 таблиц.
public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }
public Address[] Addresses { get; set; }
}
public class Address
{
public int AddressID { get; set; }
public int PersonID { get; set; }
public string AddressLine1 { get; set; }
public string City{ get; set; }
public string StateCode { get; set; }
public string PostalCode { get; set; }
public Note[] Notes { get; set; }
}
public class Note
{
public int AddressID { get; set; }
public int NoteID { get; set; }
public string NoteText { get; set; }
}
Вы бы запросили каждую из таблиц.
var people = conn.Query<Person>("select * from Person where ...");
var personIds = people.Select(x => x.PersonID);
var addresses = conn.Query<Address>("select * from Address where PersonID in @PersonIds", new { personIds });
var addressIds = addresses.Select(x => x.AddressID);
var notes = conn.Query<Note>("select * from Note where AddressID in @AddressIds", new { addressIds });
Затем, когда у вас есть все данные, подключите их, чтобы исправить отношения между этими записями, которые вы загрузили.
// Group addresses by PersonID
var addressesLookup = addresses.ToLookup(x => x.PersonID);
// Group notes by AddressID
var notesLookup = notes.ToLookup(x => x.AddressID);
// Use the lookups above to populate addresses and notes
people.Each(x => x.Addresses = addressesLookup[x.PersonID].ToArray());
addresses.Each(x => x.Notes = notesLookup[x.AddressID].ToArray());
Существуют и другие способы, но представление может не удовлетворять всем условиям, особенно при наличии сложных отношений, что приводит к взрыву записей.
Вариант 2:
По следующей ссылке вы можете использовать QueryMultiple.
https://medium.com/dapper-net/handling-multiple-resultsets-4b108a8c5172
Введите следующий код, в котором ваши дочерние запросы должны будут выбрать все записи.
var results = conn.QueryMultiple(@"
SELECT Id, CompanyId, FirstName, LastName FROM dbo.Users WHERE LastName = 'Smith';
SELECT Id, CompanyName FROM dbo.Companies WHERE CompanyId IN ( SELECT CompanyId FROM dbo.Users WHERE LastName = 'Smith' );
");
var users = results.Read<User>();
var companies = results.Read<Company>();
Тогда вы исправите отношения, как в Вариант 1 .