Предположим, что у меня есть таблица 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 сопоставить их с моими классами новые запросы не требовались?