【问题标题】:Inner join in C# with lambda在 C# 中使用 lambda 进行内部连接
【发布时间】:2020-02-17 22:34:51
【问题描述】:

我是 LINQ 和 Lambda 的新手。我想查询那一年正在学习的每个 studyYear (1,2,3) 学生。我已经在没有 Lambda 的情况下完成了,但我真的很想知道如何使用 lambda。

            var res = from s in db.student
                  join u in db.EnrolledYear
                  on s.ID equals u.studentID
                  join g in db.studyYear
                  on u.studyYearID equals g.ID
                  select new
                  {
                      Year = g.year,
                      StudentFName = s.FirstName
                      StudentLName = s.LastName
                  };

我查看了其他使用 lambda 的示例,但我并没有真正理解。 我所管理的是在学生和入学年份之间建立内部联系。现在我不明白如何完成入学年和学习年之间的内部连接。 我卡在这里,我需要再加入一个:

var res = db.EnrolledYear.Join(db.student,
                  u => u.studentID, s => s.ID,
                  (enroll, student) => new
                  {
                      Godina = enroll.year,
                      FName = student.FirstName
                      LName = student.LastName
                  })
                  .Join(.....?)

【问题讨论】:

  • 只是好奇:您是否有一个有效的 SQL 查询可以得到您想要的结果?当尝试在 LINQ 中编写复杂查询时,我发现使用经过验证的 SQL 查询很有用。
  • 是的,我有。但是我之前没有在多个表上用lambda做LINQ,只是试着通过一些例子来理解,现在我想学习和使用它
  • 除非这纯粹是科学兴趣(看看 3 个表连接是如何工作的),否则我不会将您的数据库模型破坏为 3 个表。准确地说,StudyYear 表根本没有意义;它有一列“year”,可能与该表的 ID 大小相同。好吧,ID 最终可能会更大(无法想象一年会超过 10000,而 ID==count of all-time student);在存储优化方面毫无意义。此信息的正确位置应在 EnrolledYear 表内;看:en.wikipedia.org/wiki/Denormalization

标签: c# asp.net linq join lambda


【解决方案1】:

使用Include

类似:

db.students.Include(x => x.EnrolledYears).ThenInclude(x=>x.StudyYear).Select(new ...)

【讨论】:

    【解决方案2】:

    查询中的每个子句都对应一个 lambda 调用。只需深入到每个子句并转换为适当的调用。

    这个特定的查询可以这样写:

    db.student
        .Join(db.EnrolledYear, s => s.ID, u => u.studentID, (s, u) => new { s, u })
        .Join(db.studyYear, x => x.u.studyYearID, g => g.ID, (x, g) => new { x.s, x.u, g })
        .Select(x => new
        {
            Year = x.g.year,
            StudentFName = x.s.FirstName,
            StudentLName = x.s.LastName,
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 2014-05-31
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多