2010-10-02 16 views
1

我是數據庫編程的新手,希望獲得關於性能/最佳實踐的一些提示。我正在解析一些網站,以廢除電視劇集信息並將它們放入MS SQL 2008 R2關係數據庫中。通過LINQ to SQL在C#中無需批量刪除的新對象更新表#

比方說,我有一個表填充類型Episode。當我開始新的解析時,我生成了一個新的Episodes列表。問題是,我希望數據庫與新列表完全匹配。目前我正在進行批量刪除,然後全部插入。問題是我不確定這是否是最好的方法,特別是因爲我關心數據持久性(episode_id主索引長時間保持不變)。

是否有一些簡單的方法可以將任何新劇集插入到表格中,更新任何已經改變的劇集,並刪除不再存在的任何劇集,以便最終結果與新劇集列表完全相同。一集將通過系列編號,季節編號和情節編號進行比較。

編輯:

A系列類型包含多種不同的情節類型的列表,例如:

public void ParseTVDB(Series ser) 
    { 
     var eps = new List<TVDBEpisode>(); 
     //... Parse tvdb and add each epsiode to this list 
     //... Make the Series' existing TVDBEpisodes match the new TVDBEpisodes 
    } 

    public void ParseTVRage(Series ser) 
    { 
     var eps = new List<TVRageEpisode>(); 
     //... Parse tvrage and add each epsiode to this list 
     //... Make the Series' existing TVRageEpisodes match the new TVRageEpisodes 
    } 

    public void ParseTVcom(Series ser) 
    { 
     var eps = new List<TVcomEpisode>(); 
     //... Parse tvcom and add each epsiode to this list 
     //... Make the Series' existing TVcomEpisodes match the new TVcomEpisodes 
    } 

回答

2

List<TVDBEpisode> 
List<TVRageEpisode> 
List<TVcomEpisode> 

我會在一個時間實例解析單個站點

是的,查看AttachAllOnSubmit(),InsertAllOnSubmit()和DeleteAllOnSubmit()。這些方法內置於LINQ to SQL中,並將執行上面提到的應用程序操作。這裏有一些example code

+0

聯繫起來我讀博客。它看起來會對我給出的簡單解釋起作用,但事實是DataContext比這更復雜一點。例如,一個系列有我解析的每個網站的劇集列表(目前約3個)。所以我只會一次解析一個網站。然後,我會爲每個情節類型創建一個類似於上次SaveContact()的SaveSeries(Series ser)嗎? – user380527 2010-10-02 03:08:24

+0

我編輯了我的原始文章,以反映我的意思是多個情節類型。 – user380527 2010-10-02 03:20:53

+0

好的,如果我正確解釋你的場景,你希望L2S爲你自動合併。 XXXAllOnSubmit()L2S方法本身不會這樣做。不知道你在做什麼「匹配」。如果你使用的是SQL 2008,那麼我建議看看新的MERGE操作(http://technet.microsoft.com/en-us/library/bb510625.aspx)。你可以把它放在一個存儲過程中,並使用L2S映射到存儲過程。 – 2010-10-02 03:44:50

0

我最終使用了截然不同的方法,但它完成了工作。圖我會張貼在這裏以防萬一任何人有類似的問題,好奇我是如何解決它的。由於我是數據庫新手,對SQL的具體細節不太熟悉,但對於LINQ從正常對象查詢來說我相當不錯,所以我決定採用全LINQ方法。

更改部分類,包括一個可變的檢查項目是否找到了這陣子:

public partial class TVDBEpisode 
{ 
    public bool IsFound { get; set; } 
} 

解析新的情節,與任何現有的

public void ParseTVDB(Series ser) 
{ 
    var oldEps = ser.TVDBEpisodes.ToList(); 

    foreach (/*LOOP THROUGH FOUND EPISODES FROM TVDB */) 
    { 
     string season = ;// parse season from website 
     string epnumber = ;// parse epnumber from website 

     TVDBEpisode ep; 
     // Find an episode that matches this one already in database 
     var oldEp = oldEps.FirstOrDefault((o) => o.Season == season && o.EpNumber == epnumber); 
     if (oldEp == null) 
     { 
      // Create new item 
      ep = new TVDBEpisode(); 
      // link with series (auto adds new item to the database) 
      ser.TVDBEpisodes.Add(ep); 
     } 
     else 
     { 
      // Get the item already in the database so we can modify it 
      ep = oldEp; 
     } 
     ep.SeasonNumber = season; 
     ep.EpisodeNumber = epnumber; 

     //PARSE THE REST OF THE INFO FOR THE EPISODE 

     // Set IsFound to true, because this item has been updated 
     ep.IsFound = true; 

     // Delete any item that was not updated (IsFound == false) 
     // Note that this only works on a fresh series that has been wiped where all eps start as false 
     context.TVDBEpisodes.DeleteAllOnSubmit(oldEps.Where((t) => !t.IsFound)); 
     context.SubmitChanges(); 
    } 
}