将LINQ中的值与GroupBy配对

时间:2016-11-28 21:07:47

标签: c# asp.net asp.net-mvc linq pairing

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

我现在怀疑我之所以出错的原因是因为我正在按错误的值进行分组,这实际上并不是唯一的,因此我根本无法为每个项目分配正确的值?

2 个答案:

答案 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();

然后,您可以决定问题与您的数据或代码有关。