如何在实体框架模型中编写递归查询?
问题描述:
我有一个模型,其中包括NODES和RELATIONSHIPS(通过parent_node,child_node排列将节点连接在一起)。如何在实体框架模型中编写递归查询?
Q1 - 在EF/Linq-to-entities中是否有任何方法在节点上执行查询(例如context.Nodes ..)以查找图中的“所有父母”或“或子女”?
Q2 - 如果Linq-to-entities中不存在其他方法,除了编写手动方法并执行此操作外,是否还有其他方法可以执行此操作?
问题3 - 如果手动是唯一的方法,那么我应该关心数据库命中的数量,因为方法会通过数据递归吗?或者更具体地说,是否有任何EF缓存类型功能可以帮助确保该方法从“数据库点击次数”的角度来看性能?
感谢
感谢
答
没有这样优雅的方式来flaten树。 你可以(在存储过程或实体框架中)创建一个循环,直到没有变化发生,在这个迭代中,你将在一些临时表或集合中绑定父和子的孩子。 最后你会有一个父母的收藏,sucsessor two-ples。
答
当您使用Microsoft SQL Server 2005或更高版本时,可以使用CTE(Common Table Expressions)。它们允许你定义一个递归查询。尽管SQL Server下的封面并不仅仅是为你发射一堆查询,它还是完全服务器端的,所以它可以避免你进行大量的客户端 - 服务器通信。
您将不得不使用存储的proc或普通的SQL查询来执行此操作,因为EF无法为您执行此操作。
感谢tsinik - 在这种情况下,你知道如果在EF的方式来有效地无法加载我的全部汇集在图中的节点任何参数,直到它们被使用?即在属性级别进行延迟加载?也就是说,如果我要被加载了大量的实体对象转换成图形,我想,至少只要只能用FK关系的核心实体是加载可能是从一个存储立场 – Greg 2010-05-30 20:08:24
像我知道的比较好,有在属性级别上没有延迟加载,但可以为每个表映射多个实体,以便将节点实体拆分为2并仅处理相关数据。 – tsinik 2010-05-31 11:05:19