C# 避免使用Let关键字执行自循环的LINQ

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

我有三张学生表、时间表和时间记录表

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、Hiro、Edge
  • 102743,莎拉,莱蒙 还有儿子
时间表样本数据:

时间表,学生ID,存档,完成

  • 187100,对,错
  • 196101,对,错
  • 195102,对,错
  • 199100,对,对
  • 200,102,对,对
时间记录样本数据:

TimeRecordId、TimeSheetId、BonusHour、CreationDate

  • 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中提出任何建议。
谢谢。

在顶层,您的查询由两个结果集组成:

  • db.学生
  • 配对,由
    Let
    子句定义
  • 由于顶层有两个
    From
    子句(一个用于db.Students,一个用于pair),并且没有
    Join
    Where
    子句将一个关联到另一个,因此LINQ构造了它们之间本质上的交叉连接


    我认为您需要将第二个结果集(pair)加入第一个结果集(db.Students),或者在顶级的
    Where
    子句中指出它们之间的关联
    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是从哪里来的。你可以发布更多的细节,或者源表布局的截图吗?请看我的更新。我还包括了表结构。