2013-03-11 2 views
17

Mam kwerendy SQLEntity Framework z Linq, wewnętrzna Dołącz Grupa By Order By

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 

I chce "tłumaczyć" je do LINQ. Oto, co starałem:

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

nie wiem do kogo się rozwiązać ten problem ze sprzężeń i grupy przez cały czas, ponieważ gdy robię GroupBy nie mogę uzyskać dostęp do innych członków.

+0

postu czego próbowałem tak daleko. –

+0

var query = db.Zeiterfassung.Where (x => x.Firma.ID == x.FirmenID && x.TaetigkeitID == x.Taetigkeit.ID) .GroupBy (x => x.Taetigkeit.Taetigkeit1). Wybierz (x => nową ocenę() { skillName = x.Key, czas = x.Sum (r => y.Zeit) // skillName = x.Sum (x => x.Zeit) }). OrderBy (x => x.skillName); –

Odpowiedz

35

Z danych podałeś, myślę, że zapytanie powinno wyglądać

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

albo z właściwości nawigacyjnych:

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

Dziękuję działa –

+2

Składnia metody (drugi przykładowy kod tutaj) wykorzystuje "właściwości nawigacyjne", jak mówi Sergey. Na przykład, zwróć uwagę w 'Wybierz' jak używa z.Zeit (własność bezpośrednia) z.Taetigkeit.Taetigkeit1 (właściwość nawigacji; OP osiągnięte w składni zapytania przez' JOIN t w db.Taetigkeit') oraz z.Firma.Name (właściwość nawigacji; OP osiągnięte w składni zapytania przez 'JOIN f w db.Firma'). Myślę, że właściwości nawigacji są tworzone automatycznie przez EF, jeśli istnieje relacja Klucza obcego. Ale co, jeśli nie ma związku klucza obcego; czy nadal możemy korzystać z właściwości nawigacji? Czy musimy je najpierw jawnie utworzyć? –