Необходимо выполнить следующие действия:
- получить представление из базы данных пользователей, которым необходимо получить электронное письмо
- отправить это письмо
- обновить записи пользователей с отметкой времени, когда было отправлено электронное письмо.
Этот код работает, как описано выше, но в неправильном порядке (черновой набросок / нуждается в рефакторинге):
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
}
}
Так что мне нужно обновить базу данных с отметкой времени после , электронная почта была успешно отправлена.
Но кажется, что я не могу обойти тот факт, что мне нужно создать контекст для каждого экземпляра, который мне нужно обновить.
Так что это больше проблема дизайна. Как я могу получить представление из базы данных, отправлять электронные письма и обновлять временную метку самым быстрым и недорогим способом?