2010-03-22 3 views
2

J'ai besoin d'aide pour ajouter des conditions à une requête linq.Regroupement LINQ par et création d'une formule basée sur les résultats retournés

Prenez ce petit exemple

static void Main(string[] args) 
    { 
     List<ItemEntry> items = new List<ItemEntry>(); 
     items.Add(new ItemEntry(1,1,5,1)); 
     items.Add(new ItemEntry(2, 1, 5, 1)); 
     items.Add(new ItemEntry(3, 1, 5, 1)); 
     items.Add(new ItemEntry(4, 1, 10, 3)); 
     items.Add(new ItemEntry(5, 2, 5, 1)); 
     items.Add(new ItemEntry(6, 2, 5, 1)); 
     items.Add(new ItemEntry(7, 2, 5, 1)); 
     items.Add(new ItemEntry(8, 2, 5, 1)); 
     items.Add(new ItemEntry(9, 2, 5, 2)); 
     items.Add(new ItemEntry(10, 2, 5, 2)); 

     var results = from data in items 
         group data by data.ItemTypeID 
          into grouped 
          select new { ItemID = grouped.Key, ItemPrice = grouped.Sum(data => data.ItemPrice) }; 

     foreach (var item in results) 
     { 
      Console.WriteLine(item.ItemID + " " + item.ItemPrice); 
     } 

     Console.ReadLine(); 

    } 
} 
public class ItemEntry 
{ 
    public int ItemID { get; set; } 
    public int ItemTypeID { get; set; } 
    public double ItemPrice { get; set; } 
    public int ProcessedType { get; set; } 

    public ItemEntry(int itemID, int itemTypeID,double itemPrice, int processedType) 
    { 
     ItemID = itemID; 
     ItemTypeID = itemTypeID; 
     ItemPrice = itemPrice; 
     ProcessedType = processedType; 
    } 
} 

je groupe ItemTypeID puis en créant une somme basée sur le groupe qui est bien. Je dois maintenant ajouter 2 conditions supplémentaires. Je veux garder le même groupement mais je veux faire la même chose seulement si ProcessedType == 1 si ses types 2 ou 3 alors je veux les totaliser et ensuite le diminuer le total groupé.

par exemple. Je vais utiliser ItemTypeID 1 Si je total de tous ProcessedType 1 Je reçois 15 et si je total ProcessedType3 je 10 donc je veux revenir 5.

Je ne sais pas comment ajouter la condition dans mon code.

Toute aide serait géniale !!!

TIA

Répondre

0

Ajouter une nouvelle propriété à votre classe qui fait le travail pour vous.

public class ItemEntry 
{ 
    // keep the existing properties 
    ... 

    public int TotalModifier 
    { 
     get 
     { 
      if (this.ProcessedType == 1) 
       return this.ItemPrice; 
      else 
       return -(this.ItemPrice); 
     } 
    } 

résumé Maintenant que nouvelle propriété

var results = from data in items 
        group data by data.ItemTypeID 
         into grouped 
         select new { ItemID = grouped.Key, ItemPrice = grouped.Sum(data => data.TotalModifier) }; 

Vous voulez donner cette propriété un meilleur nom que moi, mais la logique est là pour vous.

+0

H Kirk merci pour votre réponse. Cela a fonctionné un rêve :) –

+0

Désolé une autre question. Au lieu d'utiliser une liste générique pour obtenir les valeurs de si je veux utiliser LINQ-SQL. En supposant que tous les champs ont le même nom, je n'ai pas le champ TotalModifier dans la base de données. Désolé je suis assez nouveau à linq –

Questions connexes