我目前正在使用实体框架通过 ASP.NET MVC构建论坛我有 3 个主要模型[类别
] 1--* [论坛] 1--* [帖子]如果我有 5 个类别,每个类别有 4 个论坛,每个论坛有 1000 个帖子我只想显示类别,当我这样做时,这意味着我也选择了 20000 个帖子??
因为每个类别对象都有一个列表<"论坛">每个论坛对象都有列表<"帖子>由于映射和关系
可以使用延迟加载来防止检索子对象。看这里。默认情况下应启用延迟加载。
延迟加载是在第一次访问引用实体的属性时自动从数据库加载实体或实体集合的过程。
使用 POCO 实体类型时,延迟加载是通过创建派生代理类型的实例,然后重写虚拟属性以添加加载挂钩来实现的。例如,使用下面定义的博客实体类时,将在第一次访问帖子导航属性时加载相关的帖子:
public virtual ICollection<Post> Posts { get; set; }
您可以使用 .Include()
来实现特定的预先加载。例如:
db.Forums.Include(i => i.Posts)
使用存储的 SQL 过程仅显示有问题的类别。我假设此功能将经常使用,因此会影响性能。SP是预编译的,执行计划是已知的,此外,您可以在类别查询中添加一个从aFewTablesnJoins中选择不同的类别字段,其中someId=@parameter - 更少的IO,管理员对性能更满意。当然,如上所述,延迟实例化始终是一种选择。
我找到了这个例子,它使用了显式加载和 IN 运算符。代码如下所示:
(从属实体,具有 FK 导师 ID )[课程] N ->-------- 1 [导师] (主要实体)
(从属实体,具有 FK 主体 ID) [课程] N ->----- 1 [主体] (主体实体)
// get all courses
IEnumerable<Course> courses = context.Courses.ToList();
// select tutor ids from courses (C# logic, without DB access)
IEnumerable<int> tutorIds = courses.Select(c => c.TutorId);
// select subject ids from courses (C# logic, without DB access)
IEnumerable<int> subjectIds = courses.Select(c => c.SubjectId);
context.Tutors.Where( t => tutorIds.Contains(t.TutorId) ).Load();
context.Subjects.Where( s => subjectIds.Contains(s.SubjectId) ).Load();
似乎这应该有效,但我需要测试它并给你一个提示,它是否对我有用。
在 dbcontext 文件中设置lazyloading=false
。