我的数据库中有一个自引用表,看起来有点像上面那样。基本上它的设置方式是每一行都有一个唯一的ID(标识PK)和一个DependentID来指示它所依赖的集合中的任何其他记录。它与您在SQL教科书中经常看到的父子类型示例非常相似,但我的情况在某种意义上是独特的,即给定记录也可以依赖于自身(参见上面的第1行)
两个问题:
EF可以正确表示这种关系吗?我在这里阅读了几篇帖子,表明它没有优雅地处理这个场景所以我最初的想法是它甚至不值得,我可能会把它当作普通表并编写业务逻辑更好确保正确插入/更新数据。在我的场景中,我永远不会通过EF查询这些实体,应用程序基本上会在启动时加载它们然后我会在运行时对它们运行linq查询以根据需要进行过滤
假设我不能让它与EF一起工作,正如我在#1中所说的那样,我只是在启动时将所有内容加载到内存中(只有50-100左右),那将是什么通过linq加入此最有效的方式?我希望能够传入一个DependentId并获取与它相关的所有记录及其属性......所以在这个例子中我想传入'1'然后回来:
1 - 约翰 - 10
2 - 迈克 - 25
3 - Bob - 5
感谢您的帮助
答案 0 :(得分:3)
实际上,实体框架不能代表这种关系,当然也不能以递归查询的形式存在。
但您不是要求递归查询,因此您可以将DependentId视为另一个数据列。这样做,构建和执行针对数据库的问题二查询将是微不足道的。
更新:
该查询看起来像
int dependentIdToSearch = 1;
var q = from something in db.mytable
where something.DependentId == dependentIdToSearch
select new { something.Id, something.Name, something.Value };
END UPDATE
如果确实需要递归查询(所有直接和间接依赖关系),则需要具有公用表表达式的表值函数。实体框架也无法处理,至少在当前版本中不能处理。如果需要此支持,可以等待EF 5或使用Linq to SQL(自几年前的第一个版本以来支持表值函数)。
你确实也可以在内存中读取整个表,只要它是只读的,或者只有“一个内存”(单个服务器,不是负载均衡的或带有本地数据库的客户端应用程序)。
如果它是只读的,您可以选择在加载时构建一次对象图,以便以后高效执行。例如,您可以定义一个具有依赖于每个对象的对象集合的类。然后,您的查询将成为该集合的一个简单迭代。