Я пытаюсь отобразить вложенные объекты как один запрос с помощью Dapper & PostgreSQL (. Net Core), не зная, как реализовать это наиболее эффективным способом.
Классы
class Workspace {
int id
string workspace_name
CompanyDetails company_details
ICollection<Role> roles
}
class CompanyDetails {
int id primary
string company_name
string vat_number
int workspace_id
}
class Role {
int id primary
string role
int workspace_id
}
Отношения :
Рабочая область <> CompanyDetails (один к одному)
Рабочая область <> Роль (один ко многим)
Я бы хотел написать один запрос и затем получить следующие ожидаемые результаты:
results = [
{
id: 432,
workspace_name: 'test workspace',
company_details: {
id: 123
company_name: 'Test Company',
vat_number: 1231442
},
roles: [
{
id: 124,
role: 'Customer'
},
{
id: 126,
role: 'Supplier'
}
]
}
]
В настоящее время он у меня такой, но я уверен, что должен быть более эффективный способ достичь этого. Любые предложения приветствуются:
using (IDbConnection dbConnection = this.Connection)
{
dbConnection.Open();
var sql =
"SELECT id, workspace_name, ownership_status, activity_status FROM public.workspace";
var results = await dbConnection.QueryAsync<Workspace>(sql);
var workspaces = results.ToList();
foreach (var workspace in workspaces)
{
var companyDetailsSql =
"SELECT id, company_name, vat_number, registered_address, fresh_sales_id FROM public.company_details WHERE workspace_id = @workspaceId";
var companyDetails = await dbConnection.QueryAsync<CompanyDetails>(companyDetailsSql, new { workspaceId = workspace.id });
workspace.company_details = companyDetails.FirstOrDefault();
var rolesSql =
"SELECT id, company_name, vat_number, registered_address, fresh_sales_id FROM public.company_details WHERE workspace_id = @workspaceId";
var roles = await dbConnection.QueryAsync<WorkspaceRole>(rolesSql, new { workspaceId = workspace.id });
workspace.roles = roles.ToList();
}
return workspaces;
}