Dapper промежуточное отображение
Чуть более продвинутое отображение, чем в моемпредыдущий вопрос :)
Таблицы:
<code>create table [Primary] ( Id int not null, CustomerId int not null, CustomerName varchar(60) not null, Date datetime default getdate(), constraint PK_Primary primary key (Id) ) create table Secondary( PrimaryId int not null, Id int not null, Date datetime default getdate(), constraint PK_Secondary primary key (PrimaryId, Id), constraint FK_Secondary_Primary foreign key (PrimaryId) references [Primary] (Id) ) create table Tertiary( PrimaryId int not null, SecondaryId int not null, Id int not null, Date datetime default getdate(), constraint PK_Tertiary primary key (PrimaryId, SecondaryId, Id), constraint FK_Tertiary_Secondary foreign key (PrimaryId, SecondaryId) references Secondary (PrimaryId, Id) ) </code>
Классы:
<code>public class Primary { public int Id { get; set; } public Customer Customer { get; set; } public DateTime Date { get; set; } public List<Secondary> Secondaries { get; set; } } public class Secondary { public int Id { get; set; } public DateTime Date { get; set; } public List<Tertiary> Tertiarys { get; set; } } public class Tertiary { public int Id { get; set; } public DateTime Date { get; set; } } public class Customer { public int Id { get; set; } public string Name { get; set; } } </code>
Можно ли использовать один выбор, чтобы заполнить их все? Что-то вроде этого:
<code>const string sqlStatement = @" select p.Id, p.CustomerId, p.CustomerName, p.Date, s.Id, s.Date, t.Id, t.Date from [Primary] p left join Secondary s on (p.Id = s.PrimaryId) left join Tertiary t on (s.PrimaryId = t.PrimaryId and s.Id = t.SecondaryId) order by p.Id, s.Id, t.Id "; </code>
А потом:
<code>IEnumerable<Primary> primaries = connection.Query<Primary, Customer, Secondary, Tertiary, Primary>( sqlStatement, ... here comes dragons ... ); </code>
Edit1 - я мог бы сделать это с помощью двух вложенных циклов (foreach Secondary - & gt; foreach tertiaries) и выполнить запрос для каждого элемента, но мне просто интересно, можно ли это сделать с помощью одного вызова базы данных.
Edit2 - может быть, здесь уместен метод QueryMultiple, но если я правильно понимаю, то мне потребуются операторы множественного выбора. В моем примере из реальной жизни выбор имеет более 20 условий (в предложении where), где параметр поиска может быть нулевым, поэтому я не хотел бы повторять все те операторы where во всех запросах ...