Мой вариант использования следующий: на странице blazor SSR мне нужно получить один проект, включая вложенные объекты, на основе ProjectID, указанного в качестве [Параметра] на этой странице.
Полная структура, которую мне нужно получить, выглядит следующим образом. :
- Проект
-
Код: Выделить всё
1:n ProjectFase -
Код: Выделить всё
1:n ProjectItem -
Код: Выделить всё
1:n ProjectItemDate -
Код: Выделить всё
1:n Appointment
Один ProjectFase не содержит 1 или более ProjectItem
Один ProjectItem не содержит 1 или более ProjectItemDate
Один ProjectItemDate не содержит 1 или более Appointment
Класс Project выглядит следующим образом (я удалил некоторые поля для ясности):
Код: Выделить всё
public class Project
{
public string ID { get; set; } //PK
public List
? Fases { get; set; } = new List();
}
public class ProjectFase
{
public int ID { get; set; } //PK
public string ProjectID { get; set; } //FK
public List? Items { get; set; } = new List { };
}
public class ProjectItem
{
public int ID { get; set; } //PK
public int? ProjectFaseID { get; set; } //FK
public List? Dates { get; set; } = new List { };
}
public class ProjectItemDate
{
public int AppointmentID { get; set; } //PK, FK
public int? ProjectItemID { get; set; } //FK
public List? Appointments { get; set; } = new List { };
}
public class Appointment
{
public int ID { get; set; } //PK
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
Код: Выделить всё
[Parameter]
public string ProjectID { get; set; }
protected override async Task OnInitializedAsync()
{
project = await _db.GetProjectById
(ProjectID, new { projectid = "projectid", faseid = "faseid" });
}
Код: Выделить всё
public async Task
GetProjectById(string ProjectID, U parameters)
{
string connectionString = _config.GetConnectionString(ConnectionStringName);
string sql = "select p.ID as projectid, f.ID as faseid, f.Name as fasename from dbo.Projects p INNER JOIN dbo.ProjectFase f ON p.ID = f.ProjectID WHERE p.ID = '" + ProjectID + "' ";
using (IDbConnection connection = new SqlConnection(connectionString))
{
try
{
var projects = await connection.QueryAsync(sql, (project, fase) =>
{
project.Fases.Add(fase);
return project;
}, splitOn: "faseid");
var result = projects.GroupBy(p => p.ID).Select(g =>
{
var groupedProject = g.First();
groupedProject.Fases = g.Select(p => p.Fases.Single()).ToList();
return groupedProject;
});
return result.FirstOrDefault();
}
catch(Exception ex)
{
}
return null;
}
}
Примечание. Мне удалось получить желаемый результат, используя множество циклов foreach для каждого объекта/уровня, но учитывая объем данных, в больших проектах этот подход занимает 4–5 секунд, поэтому этот подход мне не подойдет.
Мне здесь действительно пригодились бы несколько советов
Подробнее здесь: https://stackoverflow.com/questions/784 ... eral-lists
Мобильная версия