Dapper One-To-Many, мультисопоставление с несколькими спискамиC#

Место общения программистов C#
Ответить
Anonymous
 Dapper One-To-Many, мультисопоставление с несколькими списками

Сообщение Anonymous »

У меня возникли некоторые трудности с расширением приведенного примера «Один-ко-многим» на https://www.learndapper.com/relationships
Мой вариант использования следующий: на странице blazor SSR мне нужно получить один проект, включая вложенные объекты, на основе ProjectID, указанного в качестве [Параметра] на этой странице.
Полная структура, которую мне нужно получить, выглядит следующим образом. : Один проект не содержит 1 или более ProjectFase
Один 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" });

}
GetProjectById — это метод внутри моего уровня DataAccess, и этот метод выглядит следующим образом:

Код: Выделить всё

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;
}
}
Все это работает как шарм, и я могу получить один объект проекта с несколькими фазами, но теперь я хочу добавить к этому следующие уровни (ProjectItem, ProjectItemDate, Appointment) объект, но не могу понять его правильно. Как мне этого добиться?
Примечание. Мне удалось получить желаемый результат, используя множество циклов foreach для каждого объекта/уровня, но учитывая объем данных, в больших проектах этот подход занимает 4–5 секунд, поэтому этот подход мне не подойдет.
Мне здесь действительно пригодились бы несколько советов

Подробнее здесь: https://stackoverflow.com/questions/784 ... eral-lists
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»