我的问题是复杂的数据库,所以我在下面使用了简化版本。
我有3张桌子。让我们打电话给他们:
Course
- id
- name
Student
- id
- name
StudentCourses
- id
- student_id
- course_id
StudentCourses设置为与其他表格相关,这是一种相当正常的多对多模式。
我使用partials扩展了我的Student对象,并为我的Student类添加了一个相当基本的方法,以便检索它们的所有类。
// 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();
在测试1中,执行的SQL使用JOIN,因此是单个数据库调用。 在测试二中,SQL是一个选择PER课程。这是一个问题。
这只是预期的行为吗?我可以重构第一种类型,但我更喜欢第二种测试的逻辑。
答案 0 :(得分:1)
对于LinqToSql,请使用 DataLoadOptions
示例:
public IQueryable<Course> GetCourses(){
var dlo = new DataLoadOptions();
dlo.LoadWith<StudentCourses>(d => d.Course);
this.LoadOptions = dlo;
return this.GetTable<StudentCourses>().Select(d=>d.Course);
}
希望这会有所帮助!!