I think the desired result you want can be set using GroupJoin ()
The code below will create such a structure
Field1, Field2, List <SubObject> null if empty
Code example
var query = dc.Table1.Where(x => Table1_id == id).OrderBy(x => x.sort) .GroupJoin(dc.Table2, (table1 => table1.Table1_id), (table2 => table2.Table2_id), (table1, table2) => new MyObject { field1 = table1.Field1, field2 = table1.Field2, manySubObjects = (table2.Count() > 0) ? (from t in table2 select new SubObject { fielda = t.fielda, fieldb = t.fieldb}).ToList() : null }).ToList();
Dotnetfiddle link
UPDATE
From your comment I saw this
ga.Select(g = > new SubObject(){fielda = g.fielda, fieldb = g.fieldb})
I think it should be (depends on how ga is built)
ga.Select(g => new SubObject {fielda = g.fielda, fieldb = g.fieldb})
Please update your question with the entire request, this will help solve the problem.
** BIS UPDATE **
sentEmails = //ga.Count() < 1 ? null : //(from g in ga select g).FirstOrDefault() == null ? null : (from g in ga select new Email{ email_to = g.email_to, email_from = g.email_from, email_cc = g.email_cc, email_bcc = g.email_bcc, email_subject = g.email_subject, email_body = g.email_body }).ToList()
Must be:
sentEmails = //ga.Count() < 1 ? null : ((from g in ga select g).FirstOrDefault() == null) ? null : (from g in ga select new Email{ email_to = g.email_to, email_from = g.email_from, email_cc = g.email_cc, email_bcc = g.email_bcc, email_subject = g.email_subject, email_body = g.email_body }).ToList()
Checks if the group has First, if the group has no entries, so for Action.Name for Time Stamp there are no emails to send. If First is not null, the loop throws the elements of the group and creates an Email list,