C# 具有自参考表的EF和Linq
我的数据库中有一个类似于上面的自引用表。基本上,它的设置是这样的:每一行都有一个唯一的ID(identity PK)和一个DependentID,以指示它所依赖的集合中的任何其他记录。它与SQL教科书中经常看到的父子类型示例非常相似,但我的案例非常独特,因为给定的记录也可以依赖于自身(请参见上面的第1行) 两个问题:C# 具有自参考表的EF和Linq,c#,linq,entity-framework,C#,Linq,Entity Framework,我的数据库中有一个类似于上面的自引用表。基本上,它的设置是这样的:每一行都有一个唯一的ID(identity PK)和一个DependentID,以指示它所依赖的集合中的任何其他记录。它与SQL教科书中经常看到的父子类型示例非常相似,但我的案例非常独特,因为给定的记录也可以依赖于自身(请参见上面的第1行) 两个问题: EF能否正确表示这种关系?我在这里读过几篇文章,认为它不能很好地处理这种情况,所以我最初的想法是,它甚至可能不值得,我最好将它作为一个普通的表来处理,并编写业务逻辑,以确保正确插入
感谢您的帮助事实上,实体框架不能表示这种关系,当然不能以递归可查询的形式表示 但您并不是要求递归查询,所以您可以将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视为另一个数据列,即没有关系,那么您只需使用它,而不需要加入任何内容。我更新了我的答案,加入了一个例子。