繁体   English   中英

Linq2Sql中的自引用表

[英]Self-referencing tables in Linq2Sql

我已经在Linq2Sql中的自引用表上看到了很多问题,以及如何急切地加载特定根对象的所有子记录。 我已经通过访问所有基础属性实现了一个临时解决方案,但是您可以看到这对性能没有任何好处。

事实是,所有记录都使用关联GUID相互关联。 下面的例子:

RootElement
- Id: 1
- ParentId: null
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement1
- Id: 2
- ParentId: 1
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement2
- Id: 3
- ParentId: 2
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement1
- Id: 4
- ParentId: 2
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

就我而言,我确实可以访问correlationId,因此我可以通过执行以下查询来检索所有记录:

from element in db.Elements
where element.CorrelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD'
select element;

但是,当然,我希望通过执行以下查询将这些元素彼此关联:

from element in db.Elements
where element.CorrelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD' && element.ParentId == null
select element;

我的问题是:是否有可能将第一个查询的结果组合为获取根元素的查询的某种“缓存机制”?

感谢您的输入。

J.

对于您要执行的操作或“缓存机制”的含义,我不太清楚。 第二个查询如何创建任何形式的关联?

我的第一个预感是GroupBy(x => x.ParentId)父项对结果进行分组,在这种情况下,您可以GroupBy(x => x.ParentId)第一个查询的结果调用GroupBy(x => x.ParentId)

我的第二个预感是,第二个查询仅获取根元素,在这种情况下,您只需对第一个查询的结果调用Where(x => x.ParentId == null)

如果这不是您想要的,请进一步说明。

编辑:

为了回应您的第一条评论,以下是如何执行两个查询:

var correlated_elements = db.Elements.Where(element => element.CollelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD');
var root_elements = correlated_elements.Where(element => element.ParentId == null);

这只会对数据库进行一次查询。 仍然,您的第二个查询不会创建层次结构-它只返回没有ParentId的元素。 如果您可以描述所需的层次结构,那么我们可以通过查询来实现它。

如果不确定对数据库实际执行了哪些查询,则可以将SQL输出到控制台,或使用LINQ-to-SQL Profiler的试用版。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM