2016-11-28 61 views
-1

結合我有交易數據的列表,由項目ID字段,它基本上給我的數據,我組的事務了多少次提出:在LINQ配對了值與的GroupBy

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 

基本上這些都是在eBay上的特定賣方在過去30天交易...一個項目可售多次以不同的價格(取決於交易時間);

我現在懷疑我之所以會出現錯誤結果,是因爲我是通過錯誤值進行分組的,因此我不能爲每個項目分配正確的值?

+0

@ matthensley.io我不明白這是如何重複的? – User987

+0

任何想法傢伙? – User987

+0

對於同一個ItemID,價格可以不同嗎?如果是這樣,您如何確定要顯示哪個價格? – sgmoore

回答

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

然後你可以決定問題是否與您的數據或代碼。

+0

我想同意你的看法,但出於某種原因,當我將它們與20美元以上的eBay進行比較時,在應用程序上它的價格是25美元,而在eBay上它顯示60美元......而在銷售歷史項目中,我無法在任何地方看到這個價格? – User987

+0

好吧,我會嘗試所有上面寫的..出於某種原因,我覺得數據有問題...感謝你的努力和時間,我接受你的回答:) – User987

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(); 
+0

我很想知道你的意思,但你能告訴我你的意思是一個實際的例子? – User987

+0

如果我在選擇之後執行groupby,那麼我不能使用像sum,average和像這樣的東西的功能... – User987

+0

是的,問題是您試圖將聚合數據包含在您的單個分組項中。我正在編輯我的帖子以顯示代碼片段,它將給你分組的項目和聚合在一起。 – Theo