对于linq多对多连接表,选择对数据库的调用太多

时间:2012-10-11 10:00:11

标签: c# sql-server linq-to-sql many-to-many

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

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

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

1 个答案:

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

希望这会有所帮助!!