我正在创建一个应用程序来显示建筑物的2D图,并为建筑物的每个故事提供单独的布局。建筑物的每个故事都有显示故事中旅行走廊的路径。此数据作为单独的对象(建筑物,故事,墙,门,路径,PathPoint等)存储在数据库中,并且这些对象具有关系(门属于墙,Path具有两个端点-PathPoints,PathPoint具有Path等) )。当程序绘制一个Story的所有内容时,我需要进入数据库并提取Story的所有数据并绘制每个项目。有没有一种方法可以查询一次数据库中的整个数据树?
当前,我针对每种对象类型进行单独的查询,并使用“ .include”来包含绘图时所需的相关对象。每种类型的对象都存储在其自己的Dictionary中,以便在需要时可以访问它们。这是我用于路径的简化示例:
var pathQuery = from p in StoredDataContext.Paths
.Include(p => p.PathPoints.Select(pp => pp.Paths))
.Where(p => p.StoryID == ActiveStory.ID)
select p;
if (pathQuery.Any())
{
foreach (Path itm in pathQuery)
{
PathDict[itm.ID] = itm;
}
}
请注意,我必须在查询中包括所有关联的PathPoint,然后需要附加到这些PathPoint的路径。绘制时,如果我需要更多的东西,则必须使用具有正确ID的PathDict来获取所需的路径。这是我必须做的简化示例:
public void FindConnectedPaths(Path startPath)
{
PathPoint startPathPoint = startPath.PathPoints.First();
// This is still fine since I used ".Include" for adjacent paths
Path secondPath = startPathPoint.Paths.First(p => p.ID != startPath.ID);
// This will not work since I did not ".Include" this far
PathPoint secondPathPoint = secondPath.PathPoints.First(p => p.ID != startPathPoint.ID);
// So I have to retrieve the secondPath from the dictionary and then find its associated PathPoints
secondPath = modelData.PathDict[secondPath.ID];
// Now this will work
secondPathPoint = secondPath.PathPoints.First(p => p.ID != startPathPoint.ID);
}
我在其他对象类型上也遇到了同样的问题。如果我能以某种方式查询整个数据树,并且EF知道所有内容之间是如何关联的,那么我就不必进行存储在单独词典中的那么多单独的查询,并确保在可能需要的任何地方都使用“ .include” 。任何帮助将不胜感激,谢谢!