我有2张桌子,Student
和CourseTaken
。我需要编写一个显示全部LINQ
的{{1}}代码,并将“活动中的学生”状态设置为CourseTaken
。
我编写了LINQ语句的一部分,该语句将显示特定ID的所有CourseTaken。如何显示true
个学生的coursetaken
来进一步过滤它? (Active
中的S_ID
包含学生ID。)
CourseTaken
注意:我需要使用LINQ和Lambda表达式。
答案 0 :(得分:3)
这将为您提供所有有活跃学生的课程的列表,假定您具有从课程到学生的导航属性,称为Students
var result = dbcont.CourseTaken.Where(c => c.Students.Any(s => s.Active));
如果这不正确,我认为您需要更好地解释您的结构,这是否是Entity Framework以及您是否具有适当的导航属性以及一些示例数据
更新
不,我没有导航属性。还有另一种方法 我能做到吗?
您可能应该这样做,因为您现在必须两次查询数据库。
var ids = dbcont.Students.Where(s => s.Active)
.Select(x => x.id)
.ToList();
var result = dbcont.CourseTaken.Where(c => ids.Contains(c.S_Id));
最后,请看一些实体框架教程,您的列命名有些奇怪,您确实需要按照EF的精神进行连接。具有导航属性
答案 1 :(得分:1)
int[] StudentsId =( from s in dbcont.Students
where s.Active ==true
select s.Id).ToArray<int>();
List<CourseTaken> courseTakenList = dbcont.CourseTaken.
Where(c=> StudentsId.Contains(c.S_Id) )
.ToList();
答案 2 :(得分:1)
在我看来,您需要以下查询:
from ct in dbcont.CourseTaken
where ct.CId == courseId
join s in dbcont.Student.Where(s => s.Active) on ct.S_Id equals s.Id into gsc
where gsc.Any()
select ct
这只返回一次CourseTaken
,无论有多少活跃的学生参加该课程,当然,只要他们至少是一名。
答案 3 :(得分:-1)
var result =
(from C in db.CourseTakens
join S in db.Students.Where(s => s.Active == true) on C.S_Id equals S.Id
select C
).ToList();
这只能获取CourseTaken数据。您可以将Student数据添加到select子句中。