2010-12-13 6 views
9

Je suis en train d'accomplir quelque chose comme ça,Linq, utilisez « variable » dans un type anonyme

var data = from p in db.Projects 
        select new 
        { 
         Cost = p.CostReports.FirstOrDefault().Charged, 
         Tax = Cost * 0.25 
        }; 

En d'autres termes, je veux utiliser le coût comme variable. C'est possible? Si c'est le cas, comment?

Mon code n'est qu'un exemple, le projet sur lequel je travaille est un peu plus compliqué.

Edit:

J'espère que cela est un meilleur exemple de ce que je suis en train de faire,

var data = (from p in db.Projects 
        select new 
        { 
         Name = p.ProjectName, 
         Customer = p.CustomerID, 
         Cost = p.Cost 
        }).GroupBy(p => p.Customer) 
        .Select(g => new 
        { 
         Something = g.Where(p => p.Customer == g.Key).Sum(p => p.Cost), 
         SomethingElse = Something * 0.25 
        }); 

Répondre

25

Utilisez le mot-clé let dans votre requête.

var data = from p in db.Projects 
      let cost = p.CostReports.FirstOrDefault().Charged 
      select new 
      { 
       Cost = cost, 
       Tax = cost * 0.25 
      }; 

Modifier

En ce qui concerne votre mise à jour et sauf des informations supplémentaires, je pourrais encore être tenté d'utiliser let en réécrivant la structure de votre requête.

var data = from g in db.Projects.Select(p => 
       new 
       { 
        Name = p.ProjectName, 
        Customer = p.CustomerID, 
        Cost = p.Cost 
       } 
      ).GroupBy(p => p.Customer) 
      let something = g.Sum(p => p.Cost) 
      select new 
      { 
       Something = something, 
       SomethingElse = something * 0.25 
      }; 

Dans ce cas, from g in ... se réfère aux données groupées, ce qui vous permet d'utiliser la syntaxe d'expression de requête sur ces données, y compris let.

+0

Merci pour votre réponse, je suppose que mon exemple était un peu à simple. Je sais à propos de "let". S'il vous plaît voir mon edit ci-dessus .. – Nordis

+0

@Nordis, mis à jour la réponse un peu. –

+0

Merci, je ne savais pas que je pourrais utiliser laisser là. :) – Nordis

5
var data = from p in db.Projects 
      let cost = p.CostReports.FirstOrDefault().Charged 
      select new 
      { 
       Cost = cost, 
       Tax = cost * 0.25 
      }; 
2

Vous pourriez au moins la chaîne sélectionne ensemble et stocker votre type anonyme comme résultat intermédiaire:

var data = (from p in db.Projects 
       select new 
       { 
        Cost = p.CostReports.FirstOrDefault().Charged, 
        Tax = Cost * 0.25 
       }) 
      .select(anon => new { Cost = anon.Cost, Tax = anon.Cost * 0.25 }); 
+1

Ce n'est pas un problème avec cette approche. C'est effectivement ce à quoi une déclaration se résume. – spender

Questions connexes