C# 具有自参考表的EF和Linq

C# 具有自参考表的EF和Linq,c#,linq,entity-framework,C#,Linq,Entity Framework,我的数据库中有一个类似于上面的自引用表。基本上,它的设置是这样的:每一行都有一个唯一的ID(identity PK)和一个DependentID,以指示它所依赖的集合中的任何其他记录。它与SQL教科书中经常看到的父子类型示例非常相似,但我的案例非常独特,因为给定的记录也可以依赖于自身(请参见上面的第1行) 两个问题: EF能否正确表示这种关系?我在这里读过几篇文章,认为它不能很好地处理这种情况,所以我最初的想法是,它甚至可能不值得,我最好将它作为一个普通的表来处理,并编写业务逻辑,以确保正确插入

我的数据库中有一个类似于上面的自引用表。基本上,它的设置是这样的:每一行都有一个唯一的ID(identity PK)和一个DependentID,以指示它所依赖的集合中的任何其他记录。它与SQL教科书中经常看到的父子类型示例非常相似,但我的案例非常独特,因为给定的记录也可以依赖于自身(请参见上面的第1行)

两个问题:

  • EF能否正确表示这种关系?我在这里读过几篇文章,认为它不能很好地处理这种情况,所以我最初的想法是,它甚至可能不值得,我最好将它作为一个普通的表来处理,并编写业务逻辑,以确保正确插入/更新数据。在我的场景中,我永远不会通过EF查询这些实体。实际上,应用程序基本上会在启动时加载所有实体,然后我会在运行时对它们运行linq查询,以根据需要进行筛选

  • 假设我不能让它与EF一起工作,并且正如我在#1中所指出的那样,我只是在启动时将它们全部加载到内存中(只有50-100个左右),那么通过linq加入这项工作的最有效方式是什么?我希望能够传入DependentId并获取与之关联的所有记录及其属性…因此在本例中,我希望传入'1'并返回:

  • 1-John-10

    2-Mike-25

    3-Bob-5


    感谢您的帮助

    事实上,实体框架不能表示这种关系,当然不能以递归可查询的形式表示

    但您并不是要求递归查询,所以您可以将DependentId视为另一个数据列。这样做,对数据库构建和执行问题2查询就很简单了

    更新:

    这个查询看起来像

    int dependentIdToSearch = 1;
    
    var q = from something in db.mytable
            where something.DependentId == dependentIdToSearch
            select new { something.Id, something.Name, something.Value };
    
    结束更新

    如果确实需要递归查询(所有的直接和间接依赖项),则需要一个具有公共表表达式的表值函数。实体框架也不能处理这个问题,至少在当前版本中不能。如果需要这种支持,可以等待EF5或使用LINQtoSQL(自几年前的第一个版本以来,LINQtoSQL就支持表值函数)

    如果表是只读的,或者只有“一个内存”(单服务器、非负载平衡或带有本地数据库的客户端应用程序),那么您确实可以在内存中读取整个表


    如果它是只读的,您可以选择在加载时构建一次对象图,以便以后能够高效地执行。例如,可以使用依赖于每个对象的对象集合定义一个类。然后,您的查询就变成了对该集合的一次微不足道的迭代。

    谢谢您的澄清,克里斯,这正是我想确定的。我猜我的linq查询本身就是一个连接,对吗?优化这种查询有什么警告吗?如果您将DependentId视为另一个数据列,即没有关系,那么您只需使用它,而不需要加入任何内容。我更新了我的答案,加入了一个例子。