Вы можете использовать Dapper
, чтобы заставить его работать, и у вас есть несколько вариантов:
Первый вариант
Вы можете запросить родительский объект, а затем запросить все дочерние объекты,Код будет выглядеть следующим образом:
var manager = await connection.QueryFirstOrDefaultAsync<Manager>("SELECT * FROM Manager AS m WHERE m.Name = @name", new {name = name}); // use your query and your parameters
manager.Facilities = await connection.QueryAsync<Manager>("SELECT * FROM Facilities AS f WHERE f.ManagerId = @managerId", new {managerId = manager.ManagerId});
// use similar queries to get Cities
Второй параметр
Вы можете использовать multimapping , чтобы получить несколько объектов (но вы должны знать,что он позволяет запрашивать до 7
зависимых объектов - для вашего случая этого будет достаточно):
public async Task<IEnumerable<Manager>> GetManagerWithFacilitiesByManagerName(string name)
{
var managersDictionary = new Dictionary<int, Manager>();
await connection.Query<Manager, Facility, Manager>(
@"SELECT *
FROM Manager AS m
INNER JOIN Facilities as f ON f.ManagerId = m.ManagerId
WHERE m.Name = @name",
(manager, facility) =>
{
Manager managerEntity;
if (managersDictionary.ContainsKey(manager.ManagerId)
{
managerEntity = managersDictionary[manager.ManagerId];
}
else
{
managerEntity = manager;
managerEntity.Facilities = new List<Facilities>();
managersDictionary.Add(managerEntity.ManagerId, managerEntity);
}
managerEntity.Facilities.Add(facility);
return managerEntity;
}
new {name = name},
splitOn: "ManagerId,FacilityId") // properties where to split entity
return managersDictionary.Values;
}
Если вы хотите только сначала Manager
, просто используйте managersDictionary.Values.FirstOrDefault()
и измените тип возврата на Task<Manager>
.