2012-08-26 18 views
0

可能重複一個foreach:
Delete object and all its child objects in Entity Framework?提高使用LINQ

此代碼:

 int WebsiteID = int.Parse(Request.QueryString["id"]); 
     Website websiteObj = db.Websites 
      .SingleOrDefault(x => x.website_id == WebsiteID); 

     foreach (BusinessObjects.Page pageObj in websiteObj.Pages) 
     { 
      foreach (SubPage subpageObj in pageObj.SubPages) 
      { 
       pageObj.SubPages.Remove(subpageObj); 
      } 
      websiteObj.Pages.Remove(pageObj); 
     } 

     foreach (Sector sectorObj in websiteObj.Sectors) 
     { 
      foreach (Product productObj in sectorObj.Products) 
      { 
       sectorObj.Products.Remove(productObj); 
      } 
      websiteObj.Sectors.Remove(sectorObj); 
     } 
     db.Websites.DeleteObject(websiteObj); 

一個網站有多個網頁,網頁上有多個子頁面。一個網站也有多個部門,每個部門有多個產品。

我想刪除網站並清除所有與它相關的關係+實體。我相信有更好的方法來編寫上述內容。

有沒有辦法改進邏輯?

+1

那些時代,我不知道爲什麼人們不只是使用SQL ... – Lucero

+0

使用SQL會不會更糟?清除所有關係和刪除行等...? – user1027620

+0

@Lucero想象一下,數據庫是否具有某種級聯刪除功能 – podiluska

回答

4

最簡單的方法,是建立在數據庫中的關係,因爲ON DELETE CASCADE

然後LINQ的變爲:

var sites = db.Websites; 
var site_id = int.Parse(Request.QueryString["id"]); 
var site = sites.FirstOrDefault(x => x.website_id == site_id); 
sites.DeleteObject(site); 

我到你的LINQ除了由來自移除唯一真正的變化是什麼如果刪除級聯不再需要:

使用FirstOrDefault略微提升性能。這對於數據庫來說並不是太大,因爲它只是執行TOP 2。當First有效時,值得不要做Single,因爲在其他情況下,它可能意味着必須檢查每一個對象(唯一的辦法就是對List<T>進行Single)*。當然,如果有可能存在兩個具有相同ID的網站,那麼我剛剛引入了一個錯誤,但是真正的錯誤是沒有將ID作爲主鍵來確保這種事情永遠不會發生。

Obj超出對象的名稱。這似乎是「對象」的縮寫,因此是同義詞 - 每一段.NET代碼中的每一個其他變量都是針對一個對象的,所以指出這一點毫無意義。

*稍微多一點,因爲我不想鼓勵壞習慣。當只能有一個匹配對象時,則First獲取該對象,而Single獲取該對象也確保它是唯一的對象(這同樣適用於OrDefault變體,除非它們在沒有找到對象時會有所不同) 。

要知道只有一個匹配對象的唯一方法是試圖找到至少兩個,然後檢查你只有一個。如果數據庫表的索引與您的搜索相關的列(它執行TOP 2而不是TOP 1),那麼這對數據庫表的影響很小,但否則可能會嚴重。

問題是這個檢查有多重要。有時你不在乎;使用First。有時你應該強烈地相信只有一個這樣的對象;使用First,但請檢查信心的原因以確保沒有錯誤(在這種情況下,檢查索引列上是否有主鍵或唯一鍵)。如果你真的需要檢查,那麼使用Single作爲使用First在這種情況下是一個壞的優化的縮影 - 更快,但錯誤的是從來沒有目標。

+0

+1我是通過編寫相同的解決方案的一半:) –

+0

唯一的缺點是,有些人對級聯任何事情都很謹慎,但他們的原因正是爲了確保有人去努力刪除相關的對象,並且不能用一個刪除刪除整個數據 - 所以這不是真正的相關反對意見。 –

+0

@JonHanna就是這樣,我只是在想一個簡單的錯誤如何消除大量的數據。我是否應該強制用戶進行手動刪除,然後啓用刪除網站? – user1027620