2010-12-13 12 views
9

Sto cercando di realizzare qualcosa di simile,LINQ, utilizzare "variabile" all'interno di un tipo anonimo

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

In altre parole, voglio usare costo come variabile. È possibile? Se é cosi, come?

Il mio codice è solo un esempio, il progetto su cui sto lavorando è un po 'più complicato.

Edit:

Spero che questo sia un esempio migliore di quello che sto cercando di fare,

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

risposta

25

Utilizzare la parola chiave let nella query.

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

Modifica

Per quanto riguarda l'aggiornamento e salvo ulteriori informazioni, potrei ancora essere tentati di utilizzare let riscrivendo la struttura della query.

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 
      }; 

In questo caso, from g in ... riferisce ai dati raggruppati, che consente di utilizzare la sintassi di query contro questi dati, comprese let.

+0

Grazie per la risposta, credo che il mio esempio è stato un po 'di semplice. So di "let". Si prega di vedere la mia modifica sopra .. – Nordis

+0

@Nordis, ha aggiornato la risposta un po '. –

+0

Grazie, non sapevo che potrei usare laggiù. :) – Nordis

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

Potresti almeno catena seleziona insieme e conservare il tipo anonimo come un risultato intermedio:

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

Non c'è niente di sbagliato in questo approccio. Questo è effettivamente ciò a cui si riferisce un'istruzione Let. – spender

Problemi correlati