Как построить запрос Entity Framework, который возвращает рекурсивные отношения внешнего ключа - PullRequest
0 голосов
/ 22 октября 2018

Предположим, что у меня есть таблица Product

CREATE TABLE Product
(
    Id INT PRIMARY KEY,
    Name VARCHAR(100) NOT NULL,
    PersonId INT FOREIGN KEY REFERENCES Person(Id)
)

CREATE TABLE Person
(
    Id INT PRIMARY KEY,
    FirstName VARCHAR(100) NOT NULL,
    LastName VARCHAR(100) NOT NULL,
    SupervisorId INT FOREIGN KEY REFERENCES Person(Id)
)

Person - довольно ванильный пример таблицы, которая ссылается на себя.

Предположим, что я хочу запросить мой Product Составьте таблицу и заполните класс соответствующей информацией о продукте, а также ID, именем и руководителем каждого человека в цепочке команд, касающихся этого продукта.

Предположим, что я наивно пишу следующий C #(при условии, что я также использую AutoMapper):

var dbQuery = context.Products;
var entities = dbQuery.ToArray();
var products = Mapper.Map(entities);

Это будет работать нормально, только если количество продуктов невелико.Это связано с тем, что Entity Framework первоначально будет запрашивать только таблицу Product и заполнять только сущности Person по мере их запроса.Использование чего-то вроде AutoMapper здесь по сути похоже на выполнение SQL в цикле и вызывает проблемы с производительностью, когда число строк в Product становится большим.

Итак, вместо этого я пишу:

var dbQuery = context.Products.Include(x => x.Person);
var entities = dbQuery.ToArray();
var products = Mapper.Map(entities);

Теперь я включаю первую Person строку, связанную со строкой в ​​Product, но это все еще проблематично, потому что у каждого персонажа есть один или несколько супервизоров, которых нужно запросить.

Есть ли какой-то способЯ могу сказать Entity Framework, чтобы рекурсивно запрашивать мою базу данных, чтобы я получал всю цепочку команд людей и руководителей, связанных с одним продуктом, чтобы при попытке AutoMapper сопоставить их с моими классами новые запросы не требовались?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...