В одном проекте на .net 4.5.2 у меня есть следующее LINQ:
var orderVolumes = _ordersRepository.GetAll()
.Where(o => o.CreationDate >= startMonth)
.GroupBy(o => new { o.CreationDate.Year, o.CreationDate.Month })
.OrderBy(or => new { or.Key.Year, or.Key.Month })
.Select(
gr =>
new TempOrderVolume
{
Year = gr.Key.Year,
Month = gr.Key.Month,
NumberOfOrders = gr.Count(),
PriceOfOrders = gr.Sum(p => p.Price) ?? 0.0m
}).ToList();
GetAll()
метод возвращает IQueryable<Order>
, Order
класс имеет свойство DateTime CreationDate
.
Я написал модульный тест для метода, который содержит этот код, я смоделировал репозиторий, создал List<Order> _orders
, добавил некоторые данные в этот список и настроил для GetAll()
метод return _orders.AsQueryable()
.
Тест не пройден с исключением аргумента
«По крайней мере, один объект должен реализовывать IComparable»
на шаге OrderBy (...).
Я не удивлен, что компилятор не умеет сравнивать анонимные объекты { or.Key.Year, or.Key.Month }
Но я не понимаю, почему это работает в самом приложении?
пожалуйста, не предлагайте мне, как решить это исключение, я знаю о возможности сделать OrderBy(...).ThenBy(...)
и об использовании неанонимного типа, реализующего IComparable.
Только мой вопрос - почему этот код работает без исключения, когда он выглядит так, как будто не должен?