2013-07-24 47 views
1

我有問題,LINQ查詢在以下情形:如何用WHERE和多對多比較

我有一些教師的活動和ActivityTeacher兩表及清單。

Activity Table 

    ActivityID  Date  Class 
    1   4/4/2012  1 
    2   4/5/2013  2 
    3   4/6/2013  5 
    4   5/6/2013  2 
    5   5/16/2013  1 
    6   5/20/2013  8 
    7   5/21/2013  7 
    8   6/22/2013  6 
    9   8/10/2013  5 
    10   8/12/2013  4 


    ActivityTeacher Table 

    ActivityID  TeacherID 
    1     2 
    1     3 
    1     4     
    2     6 
    3     6 
    3     6 
    3     4 
    2     5 
    4     2 
    4     3 
    4     6 
    5     8 
    5     7 
    5     6 
    6     6 
    6     7 
    6     9 
    6     10 
    6     1 
    6     2 
    7     2 
    7     8 
    7     9 
    7     10 
    8     3 
    8     4 
    8     6 
    8     7 
    9     10 
    9     3 
    9     2 
    10     1 
    10     2 

教師名單= {2,3,4} 現在我想基於不使用foreach循環教師= {2,3,4} 的列表來選擇活動的記錄。

回答

2

Activity實體應該有一個Teachers導航屬性,你可以利用:

context.Activities 
     .Where(x => listOfTeachers.Contains(x.Teachers.Select(t => t.TeacherId))); 

如果listOfTeachers包含三個ID 2,3,4,此查詢應該轉換爲SQL類似以下內容:

select a.* 
from Activity a 
    inner join ActivityTeacher at 
     on a.activityid = at.activityid 
where at.teacherid in (2, 3, 4); 
+0

鼓勵downvoter發表評論。否則我不能改善答案。據我所知,這應該工作,如果數據庫已被正確映射。 –

+0

使用連接操作(複雜性_n_)而不是'Where Where(... Contains)'(複雜性_n²_) –

+0

@CédricBignon:連接已經在那裏,通過導航屬性。與你的回答相反,我的實際包含了OP所要求的過濾。生成的SQL應該是這樣的:'select a。* from Activity a內部聯接ActivityTeacher at a.activityid = at.activityid where at.teacherid in(items in listOfTeachers);' –