C# 使用内部联接将6个表联接在一起&一个左外部联接-LINQ
我有6张桌子。像这样: 下面是我试图在LINQ中重新编写的SQL代码C# 使用内部联接将6个表联接在一起&一个左外部联接-LINQ,c#,mysql,sql-server,linq,join,C#,Mysql,Sql Server,Linq,Join,我有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
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语句的这个概念。谢谢你的帮助 试着不要因为有6个表以及内部和左侧连接而不知所措。尝试学习将两个集合(内部和左侧)连接在一起的概念,然后将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>();
LinqPad的重要部分是,您可以直接访问db对象,并且可以处理linq查询并查看生成的sql。然后,您可以使用sql并确保执行计划看起来良好,并且可以添加任何索引来优化查询。如果您只想进行转换,请使用LinqPad。在结果窗口旁边将有一个单独的选项卡,用于获取生成的LINQ查询有一个带有lambda符号的选项卡。。。检查that@Rahul当我单击该选项卡并再次尝试运行它时,该选项卡为空。没有显示任何结果嗯。。。不确定,但您可能想查看此帖子
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 });