首页 > 解决方案 > 为什么 linq orderby 使用匿名类型

问题描述

在 .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 的非匿名类型。

我的问题只是-为什么这段代码看起来不应该正常工作?

标签: c#linqiqueryable

解决方案


推荐阅读