【问题标题】:Joining 6 tables together with inner joins & a left outer join - LINQ将 6 个表与内连接和左外连接连接在一起 - LINQ
【发布时间】:2017-11-02 16:09:29
【问题描述】:

我有 6 张桌子。像这样:

这是我尝试在 LINQ 中重新编码的 SQL 代码。

SELECT        dbo.TimeTable.Day, dbo.TimeTable.StartTime, dbo.TimeTable.Duration, dbo.Module.ModuleRef, dbo.Module.ModuleName, dbo.Course.CourseRef, dbo.Room.RoomRef, dbo.Room.RoomName, 
                         dbo.Room.RoomFloor, dbo.Room.RoomNumber, dbo.Building.BuildingRef, dbo.Building.BuildingName
FROM            dbo.Room INNER JOIN
                         dbo.TimeTable INNER JOIN
                         dbo.Module ON dbo.TimeTable.ModuleId = dbo.Module.Id ON dbo.Room.Id = dbo.TimeTable.RoomId INNER JOIN
                         dbo.Building ON dbo.Room.BuildingId = dbo.Building.Id LEFT OUTER JOIN
                         dbo.Course INNER JOIN
                         dbo.CourseModule ON dbo.Course.Id = dbo.CourseModule.CourseId ON dbo.Module.Id = dbo.CourseModule.ModuleId

如果有人能指出我将其转换为 LINQ 语句的正确方向吗?我对 linq 语句的这个概念很陌生。感谢您的帮助!

【问题讨论】:

  • 如果您只想进行转换,请使用 LinqPad
  • 将有一个单独的选项卡用于获取与结果窗口相邻的生成的 LINQ 查询
  • 有一个带有 lambda 符号的标签...检查一下
  • @Rahul 当我单击该选项卡并尝试再次运行它时,它只是空白。不显示任何结果
  • 嗯...不确定,但您可能想查看此帖子stackoverflow.com/questions/12238423/…

标签: c# mysql sql-server linq join


【解决方案1】:

尽量不要因为您有 6 个表以及内部和左联接而不知所措。尝试学习加入 2 个集合(Inner 和 Left)的概念,然后只需将 linq 链接在一起即可。现在代码看起来有点复杂,但实际上并非如此。

给定内存对象中的以下内容:

        var rooms = new List<Room>();
        var timeTables = new List<TimeTable>();
        var modules = new List<Module>();
        var buildings = new List<Building>();
        var courses = new List<Course>();
        var courseModules = new List<CourseModule>();

您的 linq 查询可能如下所示:

           var result = rooms
            .Join(timeTables,
                room => room.Id,
                table => table.RoomId,
                (room, table) => new {room, table})
            .Join(modules,
                arg => arg.table.ModuleId,
                module => module.Id,
                (room_table, module) => new {room_table, module})
            .Join(buildings,
                arg => arg.room_table.room.BuildingId,
                building => building.Id,
                (room_table_module, building) => new {room_table_module, building})
            .GroupJoin(courseModules,
                arg => arg.room_table_module.module.Id,
                coursemodule => coursemodule.ModuleId,
                (room_table_module_building, coursemodules) => new { room_table_module_building, coursemodules})
            .SelectMany(arg => arg.coursemodules.DefaultIfEmpty(),
                (arg, coursemodule) => new { arg.room_table_module_building, coursemodule })
            .Join(courses,
                arg => arg.coursemodule.CourseId,
                course => course.Id,
                (room_table_module_building_coursemodule, course) => new { room_table_module_building_coursemodule, course });

LinqPad 的重要之处在于您可以直接访问 db 对象,并且可以玩弄 linq 查询并查看生成的 sql。然后,您可以获取 sql 并确保执行计划看起来不错,并且可以添加任何可以优化查询的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多