Dapper - не полноценный ORM, он не обрабатывает магические запросы и тому подобное.
Для вашего конкретного примера, вероятно, сработает следующее:
Выберите курсы:
var courses = cnn.Query<Course>("select * from Courses where Category = 1 Order by CreationDate");
Выберите соответствующее отображение:
var mappings = cnn.Query<CourseLocation>(
"select * from CourseLocations where CourseId in @Ids",
new {Ids = courses.Select(c => c.Id).Distinct()});
Выберитесоответствующие местоположения
var locations = cnn.Query<Location>(
"select * from Locations where Id in @Ids",
new {Ids = mappings.Select(m => m.LocationId).Distinct()}
);
Составьте карту всего этого
Оставляя это на усмотрение читателя, вы создаете несколько карт и перебираете свои курсы с указанием местоположений.
Предупреждение трюк in
сработает, если у вас меньше 2100 поисков (Sql Server), если у вас больше, вы, вероятно, захотите изменить запрос наselect * from CourseLocations where CourseId in (select Id from Courses ... )
если это так, вы можете также вытащить все результаты за один раз, используя QueryMultiple