почему linq orderby работает с анонимным типом - PullRequest
0 голосов
/ 11 сентября 2018

В одном проекте на .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.

Только мой вопрос - почему этот код работает без исключения, когда он выглядит так, как будто не должен?

...