我有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语句的概念不熟悉。谢谢你的帮助!
答案 0 :(得分:1)
尝试并且不会因为您有6个表以及内部和左侧连接这一事实而感到不知所措。尝试学习加入2个集合(内部和左侧)的概念,然后只需将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并确保执行计划看起来不错,并且可以添加任何可以优化查询的索引。