首页 > 解决方案 > IOrderedEnumerable 循环抛出有关转换为 IEnumerable 的错误

问题描述

我有一种方法可以使用 Dapper 获取一些数据,然后对该列表中的 2 列进行分组和平均。

public IEnumerable<PriceSheetCompare> GetTopXFlatPriceSheets(int topValue, int? departmentId = null, int? locationID = null, int? priceCode = null)
        {
            IEnumerable<PriceSheetCompare> rows = null;
            using (connection)
            {
                string sqlFilter = "";
                StringBuilder sql = new StringBuilder();
                sql.Append("SELECT TOP(@topValue) SKU, Price as AvgPrice FROM PriceSheetHistoryFlatView WHERE ");

                if(departmentId != null)
                {
                    sqlFilter = "DepartmentID = @departmentId ";       
                }
                if(locationID != null)
                {
                    if(!String.IsNullOrEmpty(sqlFilter))
                    {
                        sqlFilter += "AND LocationID = @locationID ";
                    }
                    else
                    {
                        sqlFilter = "LocationID = @locationID ";
                    }
                }
                if(priceCode != null)
                {
                    if (!String.IsNullOrEmpty(sqlFilter))
                    {
                        sqlFilter += "AND PriceCode = @priceCode ";
                    }
                    else
                    {
                        sqlFilter = "PriceCode = @priceCode ";
                    }
                }
                sql.Append(sqlFilter);
                sql.Append("ORDER BY PriceSheetDate DESC");
                var sheet = connection.Query<PriceSheetCompare>(sql.ToString(), 
                            new { topValue, departmentId, locationID, priceCode });

                var groupedSheet = sheet.GroupBy(x => x.SKU).Select(p => new { SKU = p.Key, AvgPrice = (decimal)p.Average(a => a.AvgPrice) }).OrderBy(o => o.SKU);
                rows = (IEnumerable<PriceSheetCompare>)groupedSheet;
            }
            return rows;
        }

该代码 sheet.GroupBy 返回一个 IOrderedIEnumerable 对象,当我尝试将其转换为这样的 IEnumerable 对象时

rows = (IEnumerable<PriceSheetCompare>)groupedSheet;

返回我得到的行

System.InvalidCastException:'无法将'System.Linq.OrderedEnumerable 2[<>f__AnonymousType32 [System.String,System.Decimal],System.String]'类型的对象转换为'System.Collections.Generic.IEnumerable`1

我需要返回这个对象,这样我就可以循环并执行一些其他计算,但 IOrderedIEnumerable 似乎不允许这样做,就像 IEnumerable 一样。

如果我确实返回 IOrderedEnumerable 并尝试使用它,我会收到有关将匿名类型转换为其他数据类型的错误。

我不明白如何使用 GroupBy 返回的 IOrderedEnumerable。

我需要做的就是在一些计算中使用分组和平均属性。

瑞安

标签: c#

解决方案


问题是您创建了匿名类型的实例,但想要返回PriceSheetCompare. 这应该可以工作,因为属性匹配:

return sheet
    .GroupBy(x => x.SKU)
    .Select(p => new PriceSheetCompare{ SKU = p.Key, AvgPrice = (decimal)p.Average(a => a.AvgPrice) })
    .OrderBy(o => o.SKU);

推荐阅读