如何使用Entity Framework从数据库中高效地查询整个数据树?

时间:2019-04-11 14:45:54

标签: c# sql entity-framework-6

我正在创建一个应用程序来显示建筑物的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” 。任何帮助将不胜感激,谢谢!

0 个答案:

没有答案