2010-11-18 3 views
1

J'essaie d'utiliser linq pour regrouper des données puis mettre à jour une propriété en fonction des valeurs de la requête.mise à jour de la propriété basée sur le résultat de la requête linq

par exemple.

var list = from c in Transactions() 
       group c by c.StoreID into g 
       select new TransactionDetail{ 
        Description = g.FirstOrDefault().Descrip, 
        BusinessName = g.FirstOrDefault().BusinessName, 
        TransactionAmount = g.Where(cr => cr.EntryType == cnCommon.INSERT_ENTRY).Sum(cr=>cr.TransactionAmount).Value, 
       PurchasesRequired = g.FirstOrDefault().PurchasesNeeded 

       }; 

     foreach (TransactionDetail item in list) 
     { 
      item.ProgressBar = (230/item.PurchasesRequired) *Convert.ToInt32(item.TransactionAmount); 
     } 


     lstTransactions.DataSource = list.ToList(); 
     lstTransactions.DataBind(); 


    } 

    public class TransactionDetail 
    { 
     public string Description { get; set; } 
     public string BusinessName { get; set; } 
     public double TransactionAmount { get; set; } 
     public double TransactionsCompleted { get; set; } 
     public int PurchasesRequired { get; set; } 
     public bool IsRedeemable { get; set; } 
     public int Balance { get; set; } 
     public int ProgressBar { get; set; } 
    } 

La requête fonctionne bien, mais quand je fais la boucle foreach TransactionDetail.ProgressBar isnt mis à jour.

Pouvez-vous voir ce que je fais mal?

Répondre

0

Qu'est-ce que les transactions()? Est-ce LINQ-to-Objects ou LINQ-to-SQL?

Peut-être que vous ne pouvez pas modifier une propriété d'un objet de la liste pendant qu'elle est en boucle. Essayez d'ajouter ".ToList()" à "liste" comme ceci:

var list = (from c in Transactions() 
      group c by c.StoreID into g 
      select new TransactionDetail{ 
       Description = g.FirstOrDefault().Descrip, 
       BusinessName = g.FirstOrDefault().BusinessName, 
       TransactionAmount = g.Where(cr => cr.EntryType == cnCommon.INSERT_ENTRY).Sum(cr=>cr.TransactionAmount).Value, 
       PurchasesRequired = g.FirstOrDefault().PurchasesNeeded 
       }).ToList(); 

boucle puis à travers les résultats.

+0

Bien sûr ....... J'ai oublié le tolist :( –

0

Un problème possible est ici la partie suivante de l'équation

(230/item.PurchasesRequired) 

item.PurchasesRequired est un entier, et donc si elle est supérieure à 230, le résultat sera 0, et quand vous multipliez 0 par article .TransactionAmount c'est toujours 0 quelle que soit la valeur de TransactionAmoutn. Même si PurchasesRequired est inférieur à 230, cela rendra très imprécis car un PurchaseRequired de 230 et 120 vous donnera le même résultat.

Essayez de former la formule comme ceci:

(int)((230*item.TransactionAmount)/item.PurchasesRequired) 
+0

Merci pour l'astuce de la formule :) –

+0

Cependant, si je place un point d'arrêt sur lstTransactions.DataSource = list.ToList(); aucun des changements de la boucle de foreach ont été appliqués –

Questions connexes