C# 避免使用Let关键字执行自循环的LINQ
我有三张学生表、时间表和时间记录表 Talbe列:C# 避免使用Let关键字执行自循环的LINQ,c#,vb.net,linq,linq-to-sql,.net-3.5,C#,Vb.net,Linq,Linq To Sql,.net 3.5,我有三张学生表、时间表和时间记录表 Talbe列: 学生:学生ID,分配ID,名字, 姓氏 时间表:时间表ID、学生ID、存档、完成 TimeRecord:TimeRecordId、TimeSheetId、BonusHour(int类型)、CreationDate 表关系: 学生1:N时间表(FK学生ID) 时间表1:N时间记录(FK时间表TID) 学生样本数据: StudentId,AssignedId,FirstName,LastName 100741,宏,约翰 101、742、H
- 学生:学生ID,分配ID,名字, 姓氏
- 时间表:时间表ID、学生ID、存档、完成
- TimeRecord:TimeRecordId、TimeSheetId、BonusHour(int类型)、CreationDate
- 学生1:N时间表(FK学生ID)
- 时间表1:N时间记录(FK时间表TID)
- 100741,宏,约翰
- 101、742、Hiro、Edge
- 102743,莎拉,莱蒙 还有儿子
- 187100,对,错
- 196101,对,错
- 195102,对,错
- 199100,对,对
- 200,102,对,对
- 11987,11907/18/2010 10:23:25
- 21962010年7月19日下午2:23:25
- 31187,112010年1月8日凌晨2:5:25
- 40187,3,8/9/2010 12:23:13下午
- 2010年7月20日下午6:15:25
- 6196221010年9月18日下午2:23:25
- 2010年8月18日下午2:23:25
- 8199420010年7月18日下午2:23:25
Dim query = From s In db.Students _
Let pair = (From ts In db.TimeSheets _
Join tr In db.TimeRecords On tr.TimeSheetId Equals ts.TimeSheetId _
Where ts.IsArchive = False And ts.IsCompleted = False And tr.TimeOut IsNot Nothing _
Group By key = New With {ts.StudentId, .MonthYear = (tr.CreationDate.Value.Month & "/" & tr.CreationDate.Value.Year)} Into TotalHour = Sum(tr.BonusHour)) _
From part In pair _
Select New With {.stId = s.AssignedId, .MonthYear = part.key.MonthYear, .TotalHour = part.TotalHour}
AssignedId , MonthYear, TotalHour
- 741, 6/2010 , 5
- 742, 6/2010 , 5
- 743, 6/2010 , 5
- 744, 6/2010 , 5
- 745, 6/2010 , 5
- 741, 7/2010 , 8
- 742, 7/2010 , 8
- 743, 7/2010 , 8
- 744, 7/2010 , 8
- 745, 7/2010 , 8
此查询循环“pair”元素并将其分配给每个学生
Dim query = From s In db.Students _
Let pair = (From ts In db.TimeSheets _
Join tr In db.TimeRecords On tr.TimeSheetId Equals ts.TimeSheetId _
Where ts.IsArchive = False And ts.IsCompleted = False And tr.TimeOut IsNot Nothing _
Group By key = New With {ts.StudentId, .MonthYear = (tr.CreationDate.Value.Month & "/" & tr.CreationDate.Value.Year)} Into TotalHour = Sum(tr.BonusHour)) _
From part In pair _
Select New With {.stId = s.AssignedId, .MonthYear = part.key.MonthYear, .TotalHour = part.TotalHour}
AssignedId , MonthYear, TotalHour
- 741, 6/2010 , 5
- 742, 6/2010 , 5
- 743, 6/2010 , 5
- 744, 6/2010 , 5
- 745, 6/2010 , 5
- 741, 7/2010 , 8
- 742, 7/2010 , 8
- 743, 7/2010 , 8
- 744, 7/2010 , 8
- 745, 7/2010 , 8
分配日期、月份、总小时
- 741, 6/2010 , 5
- 742, 6/2010 , 5
- 743, 6/2010 , 5
- 744, 6/2010 , 5
- 745, 6/2010 , 5
- 741, 7/2010 , 8
- 742, 7/2010 , 8
- 743, 7/2010 , 8
- 744, 7/2010 , 8
- 745, 7/2010 , 8
以此类推..直到“pair”元素的最后一个结果
因此,正确的结果应该是这样的:
- 741, 6/2010 , 5
- 742, 6/2010 , 8
- 743, 6/2010 , 9
- 744, 6/2010 , 10
- 745, 6/2010 , 15
- 741, 6/2010 , 5
- 742, 6/2010 , 8
- 743, 6/2010 , 9
- 744, 6/2010 , 10
- 745, 6/2010 , 15
或者像这样:
AssignedId,月/年,例如:
AssignedId, 7/2010, 8/2010
- 741 , 8hr, 2hr
- 742, 3hr ,4hr
- 743, 3hr, 1hr
- and son on..
转让日期,2010年7月,2010年8月
-741,8小时,2小时
-742,3hr,4hr
-743,3小时,1小时
-还有儿子。。
你能帮我纠正上面的问题吗?欢迎在C#或VB.NET中提出任何建议。
谢谢。在顶层,您的查询由两个结果集组成:
Let
子句定义From
子句(一个用于db.Students,一个用于pair),并且没有Join
或Where
子句将一个关联到另一个,因此LINQ构造了它们之间本质上的交叉连接
我认为您需要将第二个结果集(pair)加入第一个结果集(db.Students),或者在顶级的
Where
子句中指出它们之间的关联不要从一个学生开始,我会考虑从课时本身开始。只要Linq到Sql的映射是正确的(并且关系已经就绪),您就已经有了一些有用的关系属性可供使用。下面是我如何形成查询的,尽管在移动到VB时可能需要做一些更改
var hours = from tr in db.TimeRecords
where !tr.TimeSheet.IsArchive && !tr.TimeSheet.IsCompleted && tr.TimeOut != null
group tr.BonusHour by
new {
tr.TimeSheet.Student,
MonthYear = tr.CreationDate.Value.Month + "/" + tr.CreationDate.Value.Year
}
into g
select new {g.Key.Student.AssignedId, g.Key.MonthYear, TotalHour = g.Sum()};
如果您的模型不同,请告诉我,但这个想法应该适合您。不清楚9、10和15是从哪里来的。你可以发布更多的细节,或者源表布局的截图吗?请看我的更新。我还包括了表结构。