比较两个查询和同步结果

时间:2013-01-09 19:59:06

标签: asp.net vb.net entity-framework linq-to-entities

我有一个表(房间),其中包含许多行。每行代表一个房间,每个房间需要存在两次(一次是秋季,一次是春季学期)。有时当人们添加一个房间时,他们只会添加一个学期。我正在研究一个在学期之间同步房间的过程。

首先,我提出了两个查询,一个让所有房间都落在他们学期的专栏中,另一个让所有房间都有弹簧在他们的学期专栏中,如下:

        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

关于如何将其转化为实际可行的代码的任何建议?

2 个答案:

答案 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