Сопоставить вложенный объект с Dapper ORM - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь отобразить вложенные объекты как один запрос с помощью 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;
            }
...