Помощь с запросом linq, проблема с пропуском и приемом при объединении нескольких запросов - PullRequest
0 голосов
/ 02 сентября 2011

Я хочу вывести на домашний экран несколько уведомлений, однако я использую пейджинг, чтобы убедиться, что я не объединяю 2,3 или 4+ запросов в памяти, которые могут иметь тысячи результатов.У меня возникли небольшие проблемы при написании этого запроса, любые рекомендации будут оценены ...

Модель предметной области: у меня есть несколько отчетов, вы можете создавать / закрывать отчеты, создавать задачи и комментировать задачи, которыевсе связано с отчетом.

Мой запрос необходимо отправить:

  1. Все новые отчеты созданы (на основе даты создания)
  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
            });
}

1 Ответ

0 голосов
/ 02 сентября 2011

Пока все коллекции, с которыми вы работаете, IQuerable, они будут транслироваться в SQL, и "конкатенация в памяти" не будет выполняться.Вы можете использовать такой инструмент, как LinqPad , чтобы увидеть соответствующий сгенерированный SQL.

...