-1

我有一个交易数据列表,我按 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 上的交易......一件商品可以以不同的价格多次出售(取决于交易的时刻);

我现在怀疑我得到错误结果的原因是因为我按实际上不是唯一的错误值进行分组,因此我根本无法为每个项目分配正确的值?

4

2 回答 2

1

您的问题是在您已经对数据进行分组之后,您的选择语句内的“.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();
于 2016-11-28T21:17:09.130 回答
1

首先,我认为您的代码没有任何问题,除了您获得的价格只是产品价格之一。最好有一些选择标准(例如最新价格)。

如果您的 Title 和 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();

如果 title 或 Gallery 中的任何一个可以更改,那么您需要将它们从 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();

然后,您可以确定问题出在您的数据上还是代码上。

于 2016-11-28T22:37:19.127 回答