我有三个表Student
,TimeSheet
和TimeRecord
。
表格列:
Student
:
StudentId, FirstName, LastName
TimeSheet
:
TimeSheetId, StudentId, IsActive
TimeRecord
:
TimeRecordId, TimeSheetId, AddId
表关系:
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
计数?
答案 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查询解决了它很容易解决。