2016-11-28 1 views
-1

J'ai une liste de données de transactions, dont le groupe I par le champ ItemID qui me donne essentiellement les données combien de fois la transaction a été faite:jumelant valeurs LINQ combiné avec 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(); 

La question ici est-ce après cette LINQ les prix des produits ne correspondent tout simplement pas exactement comme je m'y attendais.

Je les ai comparées aux données sur eBay, et les prix ne correspondent pas exactement, ils sont plutôt bousculés et on ne correspond à aucun ...

Comment pourrais-je résoudre ce problème?

Edit: ce n'est pas vraiment un double de la question marquée ...

Au contraire, si je fais groupe par les articles par leurs prix, ce que je vais rester avec? Ce n'est pas la solution ...

Edit: voici quelques exemples de données

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 

Fondamentalement, ces transactions sont pour le vendeur particulier sur eBay pour les 30 derniers jours ... Un élément peut être vendu plusieurs fois avec des prix différents (selon le moment de la transaction);

Je me doute maintenant que la raison pour laquelle je me trompe résulte du fait que je groupais par la mauvaise valeur qui n'est pas réellement unique, donc je ne peux simplement pas assigner la bonne valeur à chaque article?

+0

@ matthensley.io Je ne vois pas comment c'est un doublon? – User987

+0

Des idées les gars? – User987

+0

Le prix peut-il être différent pour le même ItemID et si oui, comment déterminez-vous le prix à afficher? – sgmoore

Répondre

1

Tout d'abord, je ne pense pas qu'il y ait quelque chose de mal avec votre code, sauf le prix que vous obtenez est juste l'un des prix du produit. Il serait préférable d'avoir quelques critères pour le sélectionner (comme le prix le plus récent).

Si vos titres et GalleryURL ne changent pas, vous pouvez les ajouter au groupBy. Par exemple, si vous avez un champ de date, le code suivant essaiera de trouver le prix le plus récent.

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

Si l'une de titre ou la galerie peut changer, alors vous devez les supprimer de la groupby et choisir l'un d'eux.

Si vous voulez déboguer votre code, vous pouvez retourner l'ensemble de la ligne que vous utilisez pour afficher le prix (ou même retourner toutes les lignes du groupe), par exemple, quelque chose comme

(plutôt que de retourner chaque résultat pour chaque élément, vous pouvez filtrer pour un 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(); 

vous pouvez alors décider si le problème est avec vos données ou votre code.

+0

Je veux être d'accord avec toi, mais pour une raison quelconque j'obtiens des oscillations de prix quand je les compare aux eBay à 20 $ + ... Par exemple sur l'application c'est comment le prix est de 25 $ alors que sur l'eBay il affiche 60 $ ... Et dans les articles vendant l'histoire je ne peux pas voir ce prix n'importe où? – User987

+0

Ok, je vais essayer tout ce qui précède écrit .. Pour une raison quelconque, je pense qu'il ya quelque chose de mal avec les données ... Merci pour votre effort et le temps, j'ai accepté votre réponse :) – User987

1

Votre problème est avec le ".FirstOrDefault()" sélecteur à l'intérieur de votre déclaration de sélection après que vous avez déjà regroupé vos données. Vous obtiendrez une valeur "semi-aléatoire" pour chacun des éléments groupés.

Cette modification vous donnera toutes les données agrégées pour le groupe ainsi que les lignes individuelles qui ont été agrégées.

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

Je vais vous obtenir ce que vous voulez dire, mais pourriez-vous me montrer un exemple pratique de ce que vous entendez par là? – User987

+0

si j'effectue un groupement APRÈS la sélection, alors je ne suis pas capable d'utiliser des fonctions comme la somme, la moyenne et autres ... – User987

+0

Yup, le problème est que vous essayez d'inclure des données agrégées avec vos éléments groupés individuels. Je suis en train de modifier mon article pour afficher un extrait de code qui vous permettra de regrouper les éléments groupés et les agrégats. – Theo