【问题标题】:Join 3 tables and select 1 column using linq加入 3 个表并使用 linq 选择 1 列
【发布时间】:2015-07-28 06:30:06
【问题描述】:

我有三个表StudentTimeSheetTimeRecord

表格列:

Student

StudentId, FirstName, LastName

TimeSheet

TimeSheetId, StudentId, IsActive

TimeRecord

TimeRecordId, TimeSheetId, AddId

表关系:

  • 学生 1:N 时间表 (FK StudentId)
  • TimeSheet 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 查询以获取 id = 10 学生的 addid 计数?

【问题讨论】:

  • 由于您计划使用 LINQ 执行此操作,因此查看您的实体类很有趣,因为 LINQ 查询将依赖于它们。
  • 只想写linq查询。
  • 获得正确的 LINQ 查询的一个技巧是编写您将用于它的 SQL,然后构建 LINQ 以匹配它。这有助于保持您的查询效率。
  • 另一个提示:使用 SelectMany。你真的应该表现出一些努力。 SO 不是免费的外包服务。
  • 我写过:var query= from ot in student

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


【解决方案1】:

所以我不知道你的课程是什么样子的。 我做了一个假设,您的 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 性能方面的专家,所以如果考虑到这一点,我不确定这个查询有多“好”。

编辑: 如果你的类中有引用,你可以使用如下简单的东西:

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

但我不太确定您需要此查询来做什么 - 您是否使用 EntityFramework 并将数据库表映射到 C# 类?还是在 LinqPad 上玩?还是什么?

【讨论】:

    【解决方案2】:

    我已经使用 linq 查询自行解决了,它很容易解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2011-07-06
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多