我有一个交易数据列表,我按ItemID字段分组,它基本上为我提供了交易的次数:
var _transactionsList = TransactionsData.GroupBy(x => x.ItemID).Select(pr => new TransactionsTabResults {
ItemID = pr.Key,
ItemPrice = pr.Select(x => x.ItemPrice).FirstOrDefault(), // the issue is here, prices are not matched for the exact product...
Title = pr.Select(x => x.Title).FirstOrDefault(),
TotalSoldItems = pr.Count(),
TotalRevenuePerItem = pr.Sum(y => y.ItemPrice),
AveragePrice = pr.Average(y => y.ItemPrice),
GalleryURL = pr.Select(x => x.GalleryURL).FirstOrDefault()
}).ToList();
这里的问题是,在这个LINQ之后,产品的价格与我期望的完全不匹配。
我把它们与eBay上的数据进行了比较,价格并没有完全匹配,而是它们被混乱,没有任何东西可以匹配......
我该如何解决这个问题?
编辑:这并不是标记为......
的问题的重复相反,如果我按价格按项目分组,我还会留下什么?这不是解决方案......
编辑:这是一些示例数据
ItemID: 282183606257 AmountPaid: 55.4
ItemID: 282183606257 AmountPaid: 43.5
ItemID: 282183606257 AmountPaid: 36.5
ItemID: 1218218553606234 AmountPaid: 15.4
ItemID: 1218218553606234 AmountPaid: 53.5
ItemID: 1218218553606234 AmountPaid: 66.5
ItemID: 282053079253 AmountPaid: 446.5
ItemID: 282053079253 AmountPaid: 246.5
ItemID: 282053079253 AmountPaid: 346.5
基本上这些是过去30天内eBay上特定卖家的交易......一件商品可以多次出售,价格不同(取决于交易时刻);
我现在怀疑我之所以出错的原因是因为我正在按错误的值进行分组,这实际上并不是唯一的,因此我根本无法为每个项目分配正确的值?
答案 0 :(得分:1)
你的问题在于你的select语句中的“.FirstOrDefault()”选择器在你已经对数据进行分组之后。您将获得每个分组项目的“半随机”值。
此修改将为您提供该组的所有聚合数据以及聚合的各个行。
var _transactionsList = TransactionsData.GroupBy(x => x.ItemID).SelectMany(pr =>
pr.Select(item => new TransactionsTabResults()
{
ItemID = pr.Key,
ItemPrice = item.ItemPrice,
ItemTitle = item.ItemTitle,
TotalSoldItems = pr.Count(),
TotalRevenuePerItem = pr.Sum(y => y.ItemPrice),
AveragePrice = pr.Average(y => y.ItemPrice),
})).ToList();
答案 1 :(得分:1)
首先,我不认为您的代码有任何问题,除了您获得的价格只是该产品的价格之一。最好有一些选择它的标准(例如最新的价格)。
如果你的标题和GalleryURL没有改变,那么你可以将它们添加到groupBy。
例如,如果您有日期字段,则以下代码将尝试查找最新价格。
var _transactionsList = TransactionsData
.GroupBy(x => new { x.ItemID, x.Title, x.GalleryURL })
.Select(pr => new TransactionsTabResults
{
ItemID = pr.Key.ItemID,
Title = pr.Key.Title,
GalleryURL = pr.Key.GalleryURL,
ItemPrice = pr.OrderByDescending(a=>a.Date).First().ItemPrice ,
TotalSoldItems = pr.Count(),
TotalRevenuePerItem = pr.Sum(y => y.ItemPrice),
AveragePrice = pr.Average(y => y.ItemPrice),
}
).ToList();
如果标题或图库中的任何一个都可以更改,那么您需要从groupby中删除它们并选择其中一个。
如果要调试代码,可以返回用于显示价格的整行(甚至返回组中的所有行),例如
(而不是返回每个项目的每个结果,您可以针对一个testID过滤它)
var debug = TransactionsData
.Where(a=>a.ItemID = testID)
.GroupBy(x => new { x.ItemID, x.Title, x.GalleryURL })
.Select(pr => new
{
ItemID = pr.Key.ItemID,
Title = pr.Key.Title,
GalleryURL = pr.Key.GalleryURL,
LatestSale = pr.OrderByDescending(a=>a.Date).First() ,
AllSales = pr.ToList(),
ItemPrice = pr.OrderByDescending(a=>a.Date).First().ItemPrice ,
TotalSoldItems = pr.Count(),
TotalRevenuePerItem = pr.Sum(y => y.ItemPrice),
AveragePrice = pr.Average(y => y.ItemPrice),
}
).ToList();
然后,您可以决定问题与您的数据或代码有关。