0

我的问题是针对一个复杂的数据库,所以我在下面使用了一个简化版本。

我有 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 课程。这是一个问题。

这只是预期的行为吗?我可以重构为我猜的第一种类型,但我更喜欢第二种测试的逻辑。

4

1 回答 1

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);
}

希望这会有所帮助!

于 2012-10-11T12:28:16.083 回答