Я хочу вывести на домашний экран несколько уведомлений, однако я использую пейджинг, чтобы убедиться, что я не объединяю 2,3 или 4+ запросов в памяти, которые могут иметь тысячи результатов.У меня возникли небольшие проблемы при написании этого запроса, любые рекомендации будут оценены ...
Модель предметной области: у меня есть несколько отчетов, вы можете создавать / закрывать отчеты, создавать задачи и комментировать задачи, которыевсе связано с отчетом.
Мой запрос необходимо отправить:
- Все новые отчеты созданы (на основе даты создания)
- Все отчеты закрыты (на основе закрытой даты)
- Все новые задачи, созданные в этом отчете (диспетчер задач помогает отслеживать происходящее)
- Все последние комментарии к задаче
Мой код пока:
[NonAction]
private IList<NotifcationDTO> GetNotifications(LoggedonuserDTO loggedonuser, int skip, int take)
{
var allreports = _repo.All<Report>();
var alltasks = _repo.All<ReportTask>().Join(allreports ,
x => x.ReportID, y => y.ReportID, (_task, _report) =>
new
{
_report,
_task
})
.Where(x => x._task.CompanyID == loggedonuser.CompanyID || x._task.AssignedToCompanyID == loggedonuser.CompanyID);
var _companies = _repo.All<Company>();
var _users = _repo.All<User>();
var _activities = alltasks.OrderByDescending(o => o._task.DateCreated)
.Select(x => new NotifcationDTO
{
Title = x._report.SubjectPropertyAddress1,
MessageID = x._report.ReportID,
NotificationType = NotificationType.NewTask.ToString(),
Comment = x._task.Title,
Importance = Importance.Medium.ToString(),
Timestamp = x._task.DateCreated,
UserFriendlyName = _users.Where(y => y.UserID == x._task.UserID).FirstOrDefault().Login,
EntityFriendlyName = _companies.Where(y => y.CompanyID == x._task.CompanyID).FirstOrDefault().Identifier
});
return _activities.Skip(skip).Take(take).ToList();
// Обновление - запрос для конкатенации на ...
var comments = _repo.All<InstructionTaskComment>();
var _taskcomments = alltasks
.Join(comments, x => x._task.TaskID, y => y.TaskID, (_task, _comment) => new
{
_task,
_comment
})
.OrderByDescending(o => o._comment.Timestamp)
.Select(x => new NotifcationDTO
{
Title = x._task._report.SubjectPropertyAddress1,
MessageID = x._task._report.ReportID,
NotificationType = NotificationType.Comment.ToString(),
Comment = x._comment.Comment,
Importance = Importance.Low.ToString(),
Timestamp = x._comment.Timestamp,
UserFriendlyName = _users.Where(y => y.UserID == x._comment.UserID).FirstOrDefault().Login,
EntityFriendlyName = _companies.Where(y => y.CompanyID == x._comment.CompanyID).FirstOrDefault().Identifier
});
}