2014-06-06 27 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

是的,它只是意味着你不能走更简单的方式(这是忽略中间表)。你的第一个版本是好的,并转化为每个学生,如果他的所有活动都在列表中,就抓住他。但是,如果您想要的是抓住学生,如果至少有一项活动在列表中,您希望将您的“全部”更改为“任何” –

相关问题