2014-06-06 25 views
1

我對此持懷疑態度。我正在致力於EF Db第一個申請。是否需要在EF中執行表格連接

我有以下表格;

學生(ID)
StudentActivityLog(activityid,studentid)
活動(ID)

我的活動ID列表,我想找到誰做這些活動

學生

我覺得我可以寫下兩個linq查詢。 是這些都是正確的,如果是這樣,什麼是最好的查詢

from s in db.Students 
where s.StudentActivityLogs.All(a => activityList.Contains(a.activityId) 
select s 

from s in db.Students 
join sa in db.StudentActivityLog on s.ID equals sa.studentid 
where activityList.Contains(sa.activityId) 

,因爲我有我的學生類的內部活動清單,我認爲連接不是必需的表。但我已經看到這麼多例子的加入。請指教我。

+0

這些表格之間的關係是什麼? – Shoe

+0

@ Shoe-StudentActivityLog-> activityid引用activity的id和-StudentActivityLog-> studentid引用學生的id –

回答

2

第一個提出了更多的「LINQ感」,但除非在studentactivitylog中有其他屬性(而不僅僅是2個ID),否則最好不要讓實體Framework暴露關係表,而只是映射它與學生和活動之間NN關係,使您的查詢可能看起來像

var ActivityStudents = db.Activities 
     .Where(act=>activityList.Contains(act.activityId)) 
     .SelectMany(act=>act.Students) 

如果這是不可能的第一個查詢是好的,如果你想要的是抓住學生的活動比較都在原來的列表中,如果你想要的是抓住那些活動在列表中至少有1個匹配的學生(但也可能是其他活動),你想用任何呼叫來取代對All的呼叫

+0

你的回答對我來說有點不清楚。還有一些額外的專欄。像duedate,競爭時間...在這種情況下,第一個查詢仍然有效? –

+0

是的,它只是意味着你不能走更簡單的方式(這是忽略中間表)。你的第一個版本是好的,並轉化爲每個學生,如果他的所有活動都在列表中,就抓住他。但是,如果您想要的是抓住學生,如果至少有一項活動在列表中,您希望將您的「全部」更改爲「任何」 –

相關問題