В общем, ответ на ваш вопрос «да», но ...
.equals(...)
будет сравнивать только то, что написано для сравнения, не более, не менее. equals(Object o)
ближайшего родительского класса, который переопределил этот метод. Object#equals(Object o)
. В API-интерфейсе объекта это то же самое, что и ==
; то есть он возвращает true тогда и только тогда, когда обе переменные относятся к одному и тому же объекту, если их ссылки одно и то же. Таким образом, вы будете тестировать на равенство объектов, а не на функциональное равенство. hashCode
, если вы переопределите equals
, чтобы не «разорвать контракт». Согласно API, результат, возвращаемый методом hashCode()
для двух объектов, должен быть таким же, если их методы equals
показывают, что они эквивалентны. Обратное не обязательно верно. Чтобы это работало с EF и SQL, вы можете просто вычислить дату для вычисления числа «периодов» для группировки. По сути, вы конвертируете каждую дату в месяц, смещенное на 16-е число, и добавляете смещение для года:
var result = await db.Orders.Where(o => o.OrderDate > date)
.GroupBy(o => o.OrderDate.Month + 12*(o.OrderDate.Year - date.Year) - (o.OrderDate.Day >= 16 ? 0 : 1))
.ToListAsync();
Для @stuartd, вот как вернуть период для каждой группы: [113 ]
var resultp = result.Select(r => new {
PeriodBegin = new DateTime(date.Year + r.Key / 12 - (r.Key % 12 == 0 ? 1 : 0), r.Key % 12 == 0 ? 12 : r.key % 12, 16),
PeriodEnd = new DateTime(date.Year + r.Key / 12, r.Key % 12 + 1, 15),
Orders = r.ToList()
}).ToList();