nic nie wyciągasz wcześniej! to był tylko przykład, żebym mógł sobie łatwo sprawdzić zapytanie.
nie masz zielonego pojęcia, jak działa linq to sql, prawda? większość metod nie wyciąga danych, służą tylko do wygenerowania sql. zatem trzy razy wywołane .Where() nic nie wyciągnie z bazy. dane są fizycznie wyciągane dopiero, kiedy wywołasz Single*, First*, ToList() albo ToArray(), albo przy iterowaniu po "wynikach"; być może jeszcze w kilku innych przypadkach, ale nie chce mi się sprawdzać.
a zapełnieniem pamięci bym się nie przejmował, wyciągnięcie z bazy takiej ilości danych trwałoby koszmarnie długo, nawet nie jestem pewien, czy by się udało, bo sql server też będzie potrzebować trochę pamięci na wygenerowanie tylu wyników, a do testów pewnie korzystasz z lokalnego serwera. zresztą pomyśl, jak dużo musiałbyś mieć grup, statusów lub atrybutów żeby zobaczyć OutOfMemoryException.
możesz więc spokojnie "wyciągnąć dane" do zmiennych G, S i A, tylko nie nazywaj tak tych zmiennych, bo pierwszy lepszy programista, który zobaczy kiedyś takie coś wTwoim kodzie połamie Ci palce. pamiętaj, żeby nie użyć po drodze ToList czy ToArray. potem możesz użyć żywcem zapytania, które Ci podałem.
jest i druga opcja - myślałem, że wpadniesz na to sam - jest taka:
var r = G.Where(g => dc.Statusy.Exists(s => s.IDStatus == g.IDStatus) && dc.GrupyAtrybuty.Exists(a => a.IDGrupy == g.IDGrupy));
jeszcze na koniec jeden duperel - GrupyAtrybuty to po polsku? AtrybutyGrup chyba brzmi trochę lepiej.
na następny raz najpierw poszukaj na google i/lub sprawdź samemu, dopiero potem pytaj na forum.