Nano Hash - криптовалюты, майнинг, программирование

Рекурсивный запрос EF Core Automapper

У меня есть класс самоссылки

public class Project {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Guid? ParentId { get; set; }    
}

Я настроил базу данных psotgres с ядром ef и automapper, все работает.

Мой Dto выглядит следующим образом:

public class ProjectDto {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<ProjectPathEntry> Path { get; set; } = new HashSet<ProjectPathEntry>();
}

с помощником-dto

public class ProjectPathEntry {
    public Guid Id { get; set; }
    public string Name { get; set; }
}

Теперь проблема возникает с конфигурацией автосопоставления :) Идентификатор и имя автоматически сопоставляются по соглашению, но путь, очевидно, не может сопоставляться напрямую.

Я могу заполнить Путь отдельным запросом:

var projectPath = await dbContext.Projects.FromSqlInterpolated(
    $@"WITH recursive project(search_id, id, name) AS (
        SELECT p.""Id"", p.""Id"", p.""Name""
        FROM public.""Projects"" p

        UNION ALL

        SELECT p.""Id"", p2.id, p2.name
        FROM public.""Projects"" p, project p2
        WHERE p.""ParentProjectId"" = p2.search_id
    )
    SELECT proj.*
    FROM project
    JOIN public.""Projects"" proj on proj.""Id"" = project.id
    WHERE search_id = {project.Id}
        AND id != {project.Id}"
).ProjectTo<ProjectPathEntry>(mapper.ConfigurationProvider)
.ToListAsync(cancellationToken);

projectPath.Reverse();
project.Path = projectPath;

могу ли я как-то встроить этот запрос в мою конфигурацию автомаппера? Или есть возможность добавить SQL-представление в мою базу данных pg и сопоставить его с помощью конфигурации сущности ef?


  • Первым шагом будет написание запроса EF linq, Select, который делает то, что вы хотите. Если это работает, его можно перевести на ProjectTo. 15.01.2021

Ответы:


1

Я решил свою проблему, добавив представление в свою базу данных:

CREATE VIEW "ProjectPathView"("ProjectId", "SortId", "Id", "Name") AS
    WITH RECURSIVE project(search_id, sort_id, id, name) AS (
        SELECT p."Id",
            1,
            p."Id",
            p."Name"
FROM "Projects" p
    UNION ALL
    SELECT p."Id",
        p2.sort_id + 1,
        p2.id,
        p2.name
    FROM "Projects" p,
        project p2
    WHERE p."ParentProjectId" = p2.search_id
)
SELECT project.search_id AS "ProjectId",
    project.sort_id AS "SortId",
    proj."Id",
    proj."Name"    
FROM project
JOIN "Projects" proj ON proj."Id" = project.id;

Затем я создал модель

public class ProjectPathEntry
{
    public Guid ProjectId { get; set; }
    public long SortId { get; set; }
    public Guid Id { get; set; }
    public string Name { get; set; }
}

который представляет мой взгляд. В конфигурации EF я установил параметр ToView("ProjectPathView"). Затем я добавил отношение к моей базовой модели.

public class Project {
    ...
        public virtual ICollection<ProjectPathEntry> Path { get; set; } = new HashSet<ProjectPathEntry>();
    ...
}

и установите HasMany Конфигурацию

builder.HasMany(p => p.Path)
       .WithOne()
       .HasForeignKey(p => p.ProjectId);

Затем свойство Path в моем ProjectDto может быть автоматически сопоставлено с помощью Automapper.

15.01.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..