Сохранение DataContext, длительная операция внутри итерации - PullRequest
0 голосов
/ 26 июня 2011

Необходимо выполнить следующие действия:

  • получить представление из базы данных пользователей, которым необходимо получить электронное письмо
  • отправить это письмо
  • обновить записи пользователей с отметкой времени, когда было отправлено электронное письмо.

Этот код работает, как описано выше, но в неправильном порядке (черновой набросок / нуждается в рефакторинге):

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
    }
 }

Я отправляю электронные письма из этой коллекции по:

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
  }
}

Так что мне нужно обновить базу данных с отметкой времени после , электронная почта была успешно отправлена. Но кажется, что я не могу обойти тот факт, что мне нужно создать контекст для каждого экземпляра, который мне нужно обновить.

Так что это больше проблема дизайна. Как я могу получить представление из базы данных, отправлять электронные письма и обновлять временную метку самым быстрым и недорогим способом?

1 Ответ

2 голосов
/ 26 июня 2011

Как насчет обновления временных меток вне цикла?

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);
...