首页 > 解决方案 > 如何构造返回递归外键关系的实体框架查询

问题描述

假设我有一张桌子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);

现在,我将与 in 中的Person行关联的第一行包括在内Product,但这仍然存在问题,因为每个 Person 都有一个或多个要查询的主管。

有什么方法可以告诉 Entity Framework 递归查询我的数据库,以便我获得与单个产品关联的人员和主管的整个命令链,以便当 AutoMapper 尝试将这些映射到我的类时,不需要新的查询?

标签: c#sql-serverentity-framework

解决方案


推荐阅读