加入3个表并使用linq选择1列

时间:2015-05-16 10:40:53

标签: c# sql linq sql-server-2005

我有三个表StudentTimeSheetTimeRecord

表格列:

Student

StudentId, FirstName, LastName

TimeSheet

TimeSheetId, StudentId, IsActive

TimeRecord

TimeRecordId, TimeSheetId, AddId

表关系:

  • 学生1:N时间表(FK StudentId)
  • 时间表1:N TimeRecord(FK TimeSheetId)

Student示例数据:

StudentId  FirstName  LastName
------------------------------
  10       Macro      John
  11       Hiro       Edge
  12       Sarah      Lemon

TimeSheet示例数据:

TimeSheetId  StudentId  IsActive
--------------------------------
    187         10      True
    196         11      True
    195         12      True
    199         10      False
    200         12      False

TimeRecord示例数据:

TimeRecordId  TimeSheetId  Addid
--------------------------------
      1           187        1
      2           196        2
      3           187        3
      4           187        4
      5           196        5
      6           196        6
      7           195        7
      8           199        8   

如何编写Linq查询以获得addid学生的id = 10计数?

2 个答案:

答案 0 :(得分:2)

所以我不知道你的班级是怎样的。 我做了一个假设,你在Student类中没有TimeSheets列表(TimeSheet类和TimeRecords列表也是如此)。 我的假设基于你的问题标题,你在那里询问加入。

好的,一种方式:

var results1 = students
            .Join(timeSheets, student => student.StudentId, sheet => sheet.StudentId,
                (student, sheet) => new {StudentId = student.StudentId, SheetId = sheet.TimeSheetId})
            .Join(timeRecords, ss => ss.SheetId, record => record.TimeSheetId,
                (studentTimeSheet, record) => new {StudentId = studentTimeSheet.StudentId, Record = record})
            .Count(elem => elem.StudentId == 10);

另一种方式,通过分组 - 这样您就可以获得有关所有记录的更多信息(如AddId列表):

var results2 = students
            .Join(timeSheets, student => student.StudentId, sheet => sheet.StudentId,
                (student, sheet) => new {StudentId = student.StudentId, SheetId = sheet.TimeSheetId})
            .Join(timeRecords, ss => ss.SheetId, record => record.TimeSheetId,
                (studentTimeSheet, record) => new {StudentId = studentTimeSheet.StudentId, Record = record})
            .GroupBy(elem => new {StudentId = elem.StudentId })
            .Select(g => new StudentTimeCount(){StudentId = g.Key.StudentId, Count = g.Count(), AddIds = g.Select(elem => elem.Record.AddId)})
            .First(student => student.StudentId == 10);

类StudentTimeCount如下所示:

public class StudentTimeCount
{
    public long StudentId { get; set; }
    public long Count { get; set; }
    public IEnumerable<long> AddIds { get; set; }
}

我不是关于SQL性能的专家,所以我不确定,如何&#34;好&#34;是这个查询,如果你把它带入一个帐户。

编辑: 如果您的课程中有参考文献,您可以使用以下简单的内容:

var result3 = students.First(student => student.StudentId == 10).TimeSheets.Sum(sheet => sheet.TimeRecords.Count);

但是我不确定你需要这个查询 - 你使用EntityFramework并将数据库表映射到C#类吗?还是在LinqPad玩?或者是什么?

答案 1 :(得分:0)

我已经通过自己使用linq查询解决了它很容易解决。