2011-02-05 60 views
1

我有一個像下面使用EF的結構:實體框架:最好的方式來更新相關表

「事件」有很多個「客人」

假設Event.Guests有4個客戶元素,該ID的1,2,3,4 我想更新Event.Guests讓客人使用ID的3,4,5(如果Guest 5不存在,我想創建它)。

什麼是最有效的方式從事件中刪除現有的客人,並添加新的?

這是我在做什麼現在:

 var newGuests = new List<Guest>(); 
    var existingGuests = @event.Guests.ToList(); 

    // GetNewGuestsIds will return the new guests list (3,4,5) 
    foreach (var guestId in GetNewGuestsIds()) 
    { 
     Guest guest = existingGuests.FirstOrDefault(eg => eg.Id == guestId); 

     if (guest == null) 
     { 
      guest = db.Guests.CreateObject(); 
      // fill guest data here 
     } 

     newGuests.Add(guest); 
    } 

    foreach (var existingGuest in existingGuests) 
    { 
     // Remove the existing element from the list to add 
     var removed = newGuests.RemoveAll(g => g.Id == existingGuest.Id); 
     if (removed == 0) // The existing host is not on the list to add, delete it 
     { 
      @event.EventHosts.Remove(existingGuest); 
     } 
    } 

    foreach (var guest in newGuests) 
    { 
     @event.Guests.Add(guest); 
    } 

但我認爲這可能會提高......我只是不知道怎麼辦。

謝謝!

回答

0

經過一番思考我想出了這個結果,這似乎好了很多:

var existingGuests = @event.Guests.ToList(); 

// GetNewGuestsIds will return the new guests list (3,4,5) 
foreach (var guestId in GetNewGuestsIds()) 
{ 
    if (existingGuests.RemoveAll(g => g.Id == guestId) == 0) 
    { 
     guest = db.Guests.CreateObject(); 
     // fill guest data here 
     @event.Guests.AddObject(guest); 
    } 
} 

existingGuests.ForEach(g => @event.Guests.Remove(g)); 

我希望這可以幫助別人。