Linq2Sql中的自引用表

时间:2010-04-13 15:06:50

标签: c# linq-to-sql

我在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;

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

感谢您的投入。

学家

1 个答案:

答案 0 :(得分:0)

我不太清楚你要做什么,或者你的'缓存机制'是什么意思。第二个查询如何创建任何类型的关联?

我的第一个预感是您希望按父级对结果进行分组,在这种情况下,您只需在第一个查询的结果上调用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的试用版。