2015-09-06 232 views
0

在我的代碼中,我需要對很多不同的郵政編碼執行操作,每次操作可能需要幾秒鐘的時間,並且可能包含需要處理的數千個郵政編碼。我需要能夠跟蹤它,並在出於任何原因終止時重新啓動它。跟蹤長時間的重複操作

我有想法,建立一個搜索實體,像這樣:

public class Search 
{ 
    public int ID { get; set; } 
    public virtual ICollection<PostCode> PostCodes { get; set; } 
} 
public class PostCode 
{ 
    public int ID { get; set; } 
    public string Value { get; set; } 
} 

我無法工作了我如何跟蹤它。我的第一個想法是在每次成功操作後,從Search的集合中刪除PostCode,並保存它,以便每次加載對象時它將只有未處理的郵編,但是當我這樣做時,它會引發異常。

像這樣:

using (var db = new MyDbContext()) 
{ 
    foreach (var pc in search.PostCodes) 
    { 
     DoSomeStuff(pc); 
     search.PostCodes.Remove(pc); 
     db.SaveChanges(); 
    } 
} 

我明白這是因爲我不能改變我列舉了,但對象由於某種原因,我不能想到一個簡單的非迂迴的方式來保持跟蹤在數據庫中進行搜索。另外,由於這裏有數千個郵政編碼,所以我在這裏也關注性能。

任何人都可以建議我應該如何跟蹤搜索?

*編輯*

所以如果我跟蹤的completed屬性將這項工作正確處理數量?

using (var db = new MyDbContext()) 
{ 
    foreach (var pc in search.PostCodes.Skip(search.Completed)) 
    { 
     DoSomeStuff(pc); 
     search.Completed ++; 

     db.SaveChanges(); 
    } 
} 

如果我保存然後用Entity Framework加載實體它是否始終保持IEnumberale的順序相同?

**另一個編輯**

這是在我實際的代碼我加載搜索對象:

rs = db.RadarSearches.Include("PostCodes").FirstOrDefault(x => x.Keyword.Value == keyword && x.Complete == false); 

我想,如果我下令強制應用在這裏我就能使它保持一致。如何訂購嵌套PostCodes集合?

回答

0
  1. 將結果存儲爲數組並將該數組存儲在文件中,以便可以繼續(假設搜索結果可能在不同時間有所不同)。您需要將文件保存在您曾經去過的地方。在進程的恢復過程中,從文件加載陣列和上次成功處理的索引。
  2. 您可以存儲整個對象並刪除成功處理的對象,但出於性能考慮,您只需將該文件保存在每5日或10日的隊列中。
+0

我需要將進度存儲在數據庫中。如果我保存對象並通過實體框架加載它,我保證IEnumberable的順序是一樣的? – Guerrilla

+0

您可以通過在開始過程之前每次排序(如果允許)來確保。 –