2013-03-11 20 views
17

ho una query SQLEntity Framework con LINQ, INNER JOIN, Gruppo A, Ordine Con

select Firma.Name as companyName, 
     Taetigkeit.Taetigkeit as skillName, 
     SUM(Zeit) as time 
from Zeiterfassung 
inner join Firma On ZEiterfassung.FirmenID = Firma.ID  
inner join Taetigkeit on Zeiterfassung.TaetigkeitID = Taetigkeit.ID  
group by Taetigkeit, Firma.Name  
order by Firma.Name 

E vuole "tradurre" a LINQ. Ecco quello che ho provato:

var query = db.Zeiterfassung 
       .Where(x => x.Firma.ID == x.FirmenID && x.TaetigkeitID == x.Taetigkeit.ID) 
       .GroupBy(x => x.Taetigkeit.Taetigkeit1) 
       .Select(x => new Evaluation() { skillName = x.Key, time = x.Sum(y => y.Zeit), //skillName = x.Sum(x => x.Zeit), }) 
       .OrderBy(x => x.skillName); 

non so che per risolvere questo con si unisce e il gruppo dal perché tutto il tempo in cui faccio una groupBy i cant accedere agli altri membri.

+0

Messaggio quello che hai provato finora. –

+0

var query = db.Zeiterfassung.Where (x => x.Firma.ID == x.FirmenID && x.TaetigkeitID == x.Taetigkeit.ID) .GroupBy (x => x.Taetigkeit.Taetigkeit1) .Seleziona (x => nuova valutazione() { skillName = x.Key, tempo = x.Sum (y => y.Zeit), // skillName = x.Sum (x => x.Zeit), }). OrderBy (x => x.skillName); –

risposta

35

Dai dati che hai fornito, penso query dovrebbe essere simile

from z in db.Zeiterfassung 
join f in db.Firma on z.FirmenID equals f.ID 
join t in db.Taetigkeit on z.TaetigkeitID equals t.ID 
select new { f.Name, t.Taetigkeit, z.Zeit) into x 
group x by new { x.Taetigkeit, f.Name } into g 
select new { 
    CompanyName = g.Key.Name, 
    SkillName = g.Key.Taetigkeit, 
    Time = g.Sum(i => i.Zeit) 
} 

O con proprietà di navigazione:

db.Zeiterfassung 
    .Select(z => new { z.Zeit, z.Taetigkeit.Taetigkeit1, z.Firma.Name }) 
    .GroupBy(x => new { x.Taetigkeit1, x.Name }) 
    .Select(g => new Evaluation { 
     companyName = g.Key.Name, 
     skillName = g.Key.Taetigkeit1, 
     time = g.Sum(y => y.Zeit) 
    }); 
+2

Grazie funziona –

+2

La sintassi del metodo (il secondo esempio di codice qui) utilizza "proprietà di navigazione" come dice Sergey. Ad esempio, notate in 'Select' come usa z.Zeit (proprietà diretta) z.Taetigkeit.Taetigkeit1 (proprietà di navigazione; OP raggiunto nella sintassi della query da' JOIN t in db.Taetigkeit'), e z.Firma.Name (proprietà di navigazione; OP raggiunto nella sintassi della query da 'JOIN f in db.Firma'). Penso che le proprietà di navigazione vengano create automaticamente da EF se esiste una relazione Chiave esterna. Ma cosa succede se non esiste una relazione di chiave esterna? possiamo ancora usare le proprietà di navigazione? Dobbiamo prima crearli esplicitamente? –