【问题标题】:Loading Complete graph from Sql using LINQ使用 LINQ 从 Sql 加载完整图
【发布时间】:2009-04-11 13:15:13
【问题描述】:

假设我们有一个 Menu 类,它具有 SubMenus(这是相同类型的 Menu,因此也可以有 SubMenus 和 Items)和 Items(具有不同类型),我们将它们存储在两个表中(一个用于 Menus,一个用于对于项目)。 有什么方法可以使用 LINQ to SQL 加载 Menu 类的完整图形(其所有子菜单和项)?

【问题讨论】:

    标签: .net linq-to-sql eager-loading


    【解决方案1】:

    如果您在 SQL 中正确定义关系,LINQToSQL 应该通过对菜单的单个查询为您返回所有菜单/项目。但是,这不会让它重新用作图形,而是用作菜单的枚举(带有相关的菜单和项目)。您需要遍历此枚举并自行构建图表。

    另一方面,您也许可以这样做:

    var roots = db.Menus.Where( m => !m.SubMenus.Count == 0 );
    

    然后,roots 将是基本菜单的集合。如果您不打算对其执行任何图形分析算法,而只是打算从上到下遍历它以构建 GUI 组件,这可能就足够了。

    【讨论】:

    • 我想使用 DataContractSerializer 将完整的图形序列化为 XML 文件,所以我认为我需要加载所有对象。我可以使用 LoadOptions 以某种方式预先加载它们吗?
    • 如果你想序列化图形结构而不仅仅是元素,我认为你需要构建实际的图形。在枚举中,任何共享菜单的父/子属性中都会有重复的元素。检查您的 DBML - 关系可能已经预先加载。
    • 我要序列化元素。
    • 尝试使用部分类将您的实体标记为可序列化,并查看这是否会产生可用的格式。如果没有,您可能还需要实现 ISerializable 以按照您想要的方式序列化实体。
    • 我的问题不在于序列化方法。如何使用单个查询从文件中加载数据以将其传递给 WriteObject 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2021-01-23
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多