Как искать в диапазоне дат для нескольких объектов? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть следующие таблицы:

  • CompanyHistory: Id StartDate EndDate
  • CustomerHistory Id CompanyId StartDate EndDate
  • CustomerPayment Идентификатор CustomerId StartDate Сумма EndDate

Я хочу сделать отчет для поиска всех платежей и их клиентов и их компаний в пределах определенного диапазона дат (firstDay, endDay).

Я сделал это, используя этот код только для CustomerPayment, и я должен сделать то же самое для таблиц CustomerHistory и companyHistory.

А производительность действительно плохая.

Есть ли способ улучшить запросы или мне следует изменить дизайн моей БД?

var payments= db.CustomerPayment.Where(s =>> 
             ((firstDay <= s.EndDate && lastDay >= s.StartDate) && 
              (lastDay <= s.EndDate || lastDay >= s.EndDate) && 
              (firstDay > s.StartDate || firstDay < s.StartDate)) ||
             ((s.EndDate == null) && ((firstDay >= s.StartDate) || 
              (firstDay <= s.StartDate && lastDay >= s.StartDate)));

1 Ответ

1 голос
/ 20 июня 2019
  1. Вы говорите, что хотите каждый платеж (платежи всегда выполняются в определенный момент), поэтому я запутался, почему для этого были бы и дата окончания, и дата начала.Если возможно, потеряйте один из них.
  2. Платеж находится внутри вашего окна, если начальная дата предшествует последнему дню вашего отчета и ваша конечная дата превышает начальную дату вашего отчета.Очевидно, endDate может иметь нулевое значение бесконечное, поэтому я добавил это в следующем простом и понятном утверждении:

var payments= db.CustomerPayment.Where(s =>> (s.StartDate <= lastDay && (a.EndDate >= firstDay || a.EndDate == null));

Если производительность этого запроса все еще недостаточна, у вас просто слишком много записей в базе данных для производительности.Вы можете либо написать индекс в соответствии с предложением @Uwe Keim, либо рассчитать один раз в месяц (или неделю или независимо от того, какой у вас самый маленький показатель отчетности) сумму платежей на одного клиента и сохранить эти результаты в своей базе данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...