c# - 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__AnonymousType3
2 [System.String,System.Decimal],System.String]'类型的对象转换为'System.Collections.Generic.IEnumerable`1
我需要返回这个对象,这样我就可以循环并执行一些其他计算,但 IOrderedIEnumerable 似乎不允许这样做,就像 IEnumerable 一样。
如果我确实返回 IOrderedEnumerable 并尝试使用它,我会收到有关将匿名类型转换为其他数据类型的错误。
我不明白如何使用 GroupBy 返回的 IOrderedEnumerable。
我需要做的就是在一些计算中使用分组和平均属性。
瑞安
解决方案
问题是您创建了匿名类型的实例,但想要返回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);
推荐阅读
- scala - 添加列,同时保持 Apache Spark Scala 中现有列的相关性
- javascript - ReactJS,将道具从父组件传递给子组件?
- php - wc_update_order_item 未正确保存
- android - 如何在 Android 中使用 FFmpeg(v 4.0) HwAccell
- c++ - 如何在 C++ UWP 应用程序中使用静态库?
- asp.net - 调试到 asp.net Identity 开源代码
- c# - 窗口关闭后退出 WPF 应用程序
- c# - Unity 中的倒数计时器与 Photon 的 PUN 2
- java - 使用来自另一个项目的 CN1 Eclipse 项目?
- java - 如何创建一个类来存储对象列表并在JSP中显示而不删除列表?