2011-06-26 59 views
0

以下操作需要進行:保留DataContext的,長期運行的內迭代操作

  • 從用戶的數據庫,需要收到一封電子郵件
  • 得到一個視圖發送這封電子郵件
  • 更新帶有郵件發送時間戳的usres記錄。

此代碼之上,但以錯誤的順序描述(草圖/需要重構):

foreach(Invitation item in MailMessageController.GetInvitations()) 
{ 
    if (SendMessage(item)) // <<-- bool if message was sent successfully 
    { 
    // here I want to update the database with the timestamp 
    } 
} 

所以:

public class MailMessageController 
{ 
    public static IEnumerable<Invitation> GetInvitations() 
    { 
    using (boDataContext context = new boDataContext()) 
    { 
     // the table where the timestamps have to be set 
     Table<Computer> computer = context.GetTable<Computer>(); 
     // the view that contains the users email addresses 
     Table<Invitation> report = context.GetTable<Invitation>(); 
     // get the view from the database 
     IEnumerable<Invitation> items = report.AsEnumerable<Invitation>(); 
     foreach (Invitation item in items) 
     { 
      // update the timestamp (not good, the e-mail hasn't been sent) 
      Computer c = computer.FirstOrDefault(
        i => i.ComputerID == item.ComputerID 
      ); 
      if (c != null) 
      { 
       c.DateInvited = DateTime.Now; 
      } 
      yield return item; 
     } 
     context.SubmitChanges(); // <-- this should commit the changes 
    } 
} 

我通過發送電子郵件從這個集合我需要在電子郵件發送成功後用時間戳更新數據庫。 但似乎我無法解決這個事實,即我需要爲每個需要更新的實例創建一個上下文。

所以這是更多的設計問題。 如何從數據庫中獲取視圖,發送電子郵件並以最流暢,更低成本的方式更新時間戳?

+2

從MSDN:「一個DataContext是輕量級的,並不昂貴創建」爲什麼不更新數據庫與循環後的時間戳? – Magnus

回答

2

如何更新循環外的時間戳?

var timeStamps = new List<Tuple<DateTime, int>>(); 
foreach(Invitation item in MailMessageController.GetInvitations()) 
{ 
    if (SendMessage(item)) // <<-- bool if message was sent successfully 
    { 
    timeStamps.Add(new Tuple<DateTime, int>(DateTime.Now, item.ID); 
    } 
} 
UpdateTimeStamps(timeStamps); 
+0

尤其是MSDN的鏈接在這裏幫助......;)謝謝 –