Entity framework 4 EF4使用单个调用检索多对多

Entity framework 4 EF4使用单个调用检索多对多,entity-framework-4,Entity Framework 4,想象一个简单的数据库,其中学生有多个课程和多个考试,给定一个已经从db加载的学生列表,我想用每个数据库调用填充课程和考试列表 我知道我可以使用Include-up-front,它只需一次调用即可检索所有内容: var students = context.Students.Include("Courses").Include("Exams").ToList(); 但我还需要能够在以后加载课程和考试 我试过: var courses = students.SelectMany(x => x

想象一个简单的数据库,其中学生有多个课程和多个考试,给定一个已经从db加载的学生列表,我想用每个数据库调用填充课程和考试列表

我知道我可以使用Include-up-front,它只需一次调用即可检索所有内容:

var students = context.Students.Include("Courses").Include("Exams").ToList();
但我还需要能够在以后加载课程和考试

我试过:

var courses = students.SelectMany(x => x.Courses).ToList();
var exams = students.SelectMany(x => x.Exams).ToList();

但这导致每个学生有两个db调用。如何更有效地实现这一点?

根据我的经验,您不能同时加载多个EntityCollection。您在问题中提供了两个选项。您可以在单个查询中急切地加载相关实体,也可以稍后通过每个要加载的EntityCollection的查询来加载它们。

请确保关闭实体框架模型的延迟加载,IIRC它将导致这些集合属性在您迭代时触发查询。否则它看起来应该只处理一个查询。

ToList计算并导致框架调用数据库。是的,我知道这一事实。你的意思是什么?只是说说而已。我想你不知道。我很高兴每一个集合有一个呼叫,但在我的原始帖子中的选项二会导致2n个呼叫,其中n是学生的数量。例如,假设有100名学生,它会打100个电话为每个学生检索课程,然后再打100个电话为考试检索课程。一定有比这更有效的方法吗?啊,我误读了你的问题,没有意识到你试图为一整组学生检索整个集合。据我所知,完成此任务的唯一有效方法是确保您急切地加载EntityCollections。