我有一个表(房间),其中包含许多行。每行代表一个房间,每个房间需要存在两次(一次是秋季,一次是春季学期)。有时当人们添加一个房间时,他们只会添加一个学期。我正在研究一个在学期之间同步房间的过程。
首先,我提出了两个查询,一个让所有房间都落在他们学期的专栏中,另一个让所有房间都有弹簧在他们的学期专栏中,如下:
Dim getFallRooms = (From p In dbContext.Rooms _
Where p.semester = "Fall" _
Select p)
Dim getSpringRooms = (From p In dbContext.Rooms _
Where p.semester = "Spring" _
Select p)
结果将包含多行,其中包含以下列:id,building,room,occupant和semester。
我想做的是这样的事情(伪):
For Each row in getFallRooms
If row.building and row.room not in getSpringRooms Then
' Code to add new row with fall as the semester.
End If
Next
关于如何将其转化为实际可行的代码的任何建议?
答案 0 :(得分:1)
你可以做一些与正在做的事情at this link完全相似的事情。
我不知道如何在VB.NET中做到这一点,但是我在C#中如何使用LINQ扩展方法:
var fallRooms = dbContext.Rooms.Where(room => room.semester.Equals("Fall")).Select(r => r.Name);
var nonSpringRooms = dbContext.Rooms.Where(room => room.semester.Equals("Spring"))
.Select(r => r.Name)
.AsQueryable()
.Except(fallRooms);
之后,您可以在非SpringRooms上执行For Each
循环,以执行您想要执行的任何操作。
另一方面,如果我错了,有人应该纠正我,但我相信上面的代码只会进入数据库一次。因此,你也可以获得这样的好处。
编辑:我意识到,因为他们在同一张桌子上,所以记录会有相同的主键。我随后改变了上面的查询,假设你的名字字段在两个记录中都是相同的。答案 1 :(得分:1)
For Each row in getFallRooms
If (From p in getSpringRooms
Where p.building = row.building
AndAlso p.room = row.room).Count = 0 Then
' Code to add new row with fall as the semester.
End If
Next