我的问题是针对一个复杂的数据库,所以我在下面使用了一个简化版本。
我有 3 张桌子。让我们称呼他们:
Course
- id
- name
Student
- id
- name
StudentCourses
- id
- student_id
- course_id
StudentCourses 设置为与其他两个表相关,这是一种相当正常的多对多模式。
我使用部分扩展了我的学生对象,并为我的学生类添加了一个相当基本的方法,以便检索他们的所有类。
// Partial to add helper method to LINQ generated Student class
public partial class Student {
// Get courses that this student is enrolled.
public IQueryable<Course> GetCourses(){
return this.StudentCourses.Select(d=>d.Course);
}
}
我预计这可能会在内部使用连接,但是在记录了 SQL 查询后,我可以看到它实际上为每个连接创建了一个“SELECT * FROM Courses”。
执行此行为的更好方法是什么?每行一个选择似乎非常低效!
进一步调查 经过一些评论后,我决定进一步调查。我发现了以下内容:
MyDataContext db = new MyDataContext();
var student = db.Students.Single(i=>i.id);
var testOne = db.StudentCourses.Where(u=>u.student_id == student.id).
Select(d=>d.Courses).ToList();
var testTwo = student.StudentCourses.Select(d=>d.Courses).ToList();
在测试一中,执行的 SQL 使用 JOIN,因此是单个数据库调用。在测试二中,SQL 是一门选择 PER 课程。这是一个问题。
这只是预期的行为吗?我可以重构为我猜的第一种类型,但我更喜欢第二种测试的逻辑。