为2个表编写LINQ查询

时间:2019-05-15 23:32:13

标签: c# linq

我有2张桌子,StudentCourseTaken。我需要编写一个显示全部LINQ的{​​{1}}代码,并将“活动中的学生”状态设置为CourseTaken

我编写了LINQ语句的一部分,该语句将显示特定ID的所有CourseTaken。如何显示true个学生的coursetaken来进一步过滤它? (Active中的S_ID包含学生ID。)

CourseTaken

注意:我需要使用LINQ和Lambda表达式。

4 个答案:

答案 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子句中。