Для подачи заявки мне необходимо отправлять персонализированные электронные письма с приглашениями конечным пользователям каждый час.У этих пользователей адреса электронной почты, а остальная их информация находится в базе данных.
- Для получения сообщения электронной почты доступны все пользователи, у которых бит
Planned.IsPlannable
установлен на True
и между Planned.DateStart
и Planned.DateEnd
между определенным периодом доступны. - Существует около 350 сообщений для отправки каждый час .
- Вся информация, которая должна быть включена в сообщение, поступает из базы данных.
- Приложение является консольным приложением .NET4.0 , для доступа к данным я использую Subsonic3.0 .
Есть вминимум два сценария на выбор: извлечение соответствующих данных с помощью
1 :) Просмотреть что-то вроде:
SELECT [Computer].ComputerName,
[User].UserEmail,
[Planned].DateAvailable,
[Planned].DatePlanned
FROM [Computer]
INNER JOIN
[Planned] ON [Computer.ComputerID] = [Planned.ComputerID]
INNER JOIN
[User] ON [Computer].UserID = [User].UserID
WHERE (DATEDIFF(dd, GETDATE(), [Planned.DateAvailable]) < 10)
AND Planned.IsPlannable = 1
и compose ,на основе результатов этого представления соответствующие сообщения в коде C # этого приложения.
2 :) Составьте сообщение целикомна sql-сервере в представлении и возвращаем что-то вроде
[EmailTo]
[Subject]
[Body]
Затем итерируем только результаты и создаем MailMessage
Объекты из него
, в обоих случаях я получаюсообщения типа:
foreach (vwGetInvitableComputer u in UserController.GetAllInvitableUsers())
{
// where the usercontroller wraps the Subsonic logic.
// the composition happens here
}
Выполните итерации в коде C # и просто составьте почтовое сообщение из этих предварительно отформатированных данных.
Какой сценарий целесообразно выбрать для повышения производительности и ресурсов?
обновление: В базе данных действительно есть текстовые манипуляции в варианте 2. Однако этозаменяя три строки в сообщении на CompterName, DateStart и DateEnd.Per возможно, SQL-представления достаточно умны, чтобы распределить производительность для этого, в то время как код c # делает это «по запросу»?