2016-11-03 4 views
0

Ich habe die beiden TabellenHinzufügen eines weiteren Tabelle zu einer gruppierten Linq-Abfrage

Person 
__________ 
PersonID 
PersonName 
DOB 
Status 


Notes 
__________ 
NoteID 
PersonID 
NoteText 
Comments 
LineNo 

hier einige Beispiel-Inhalt

PersonID PersonName DOB   Status 
    1 Mark Jacobs 07/07/1961 Active 

und

NoteID PersonID NoteText LineNo 
123  1  Line 1  1 
234  1  Line 2  2 
236  1  Line 3  3 

So als Endergebnis Ich möchte eine Linq-Abfrage, um so etwas anzuzeigen

PersonID PersonName DOB   Note 
    1 Mark Jacobs 07/07/1961  Line 1, Line 2, Line 3 

Ich habe eine Arbeits Linq-Abfrage für die Notes-Tabelle, möchte aber auch einige Felder von Personen Tabelle enthalten:

var result = (from n in db.Notes 
        group n.NoteText by n.PersonID into g 
        select new { 
         PersonID = g.Key, 
         Notes = g.ToList() 
        }).AsEnumerable() 
       .Select(item => new NoteGroupDTO { 
        PersonID = item.PersonID, 
        Notes = string.Join(", ", item.Notes) 
       }).ToList(); 

Ich mag Person Namen hinzufügen, DOB und Status die Liste auswählen

habe ich eine Klasse

public class PersonNoteDTO 
{ 
    public int PersonID { get; set; } 
    public string PersonName { get; set; } 
    public DateTime DOB { get; set; } 
    public string Status { get; set; } 
    public string Notes { get; set; } 
} 

Zu meiner Abfrage Ich habe eine Verknüpfung und order by-Klausel von Zeilennummern zu bestellen. Aber ich bin nicht sicher, wie Felder in meinem anonymen Objekt in die Auswahlliste hinzuzufügen:

var result = (from n in db.Notes 
        join p in db.Persons on n.PersonID=p.PersonID 
        orderby n.LineNo 
        group n.NoteText by n.PersonID into g 
        select new { 
         PersonID = g.Key, 
         Notes = g.ToList() 
        }).AsEnumerable() 
       .Select(item => new PersonNoteDTO { 
        PersonID = item.PersonID, 
        Notes = string.Join(", ", item.Notes) 
       }).ToList(); 

Antwort

1

Sie können Gruppe durch mehrere Felder und dann Zugriff auf diese Eigenschaften durch die .Key Eigenschaft:

var result = (from n in db.Notes 
       join p in db.Persons on n.PersonID equals p.PersonID 
       group new { n.NoteText, n.LineNo } by new { n.PersonID, n.PersonName, p.DOB, p.Status } into g 
       select new { 
        PersonID = g.Key.PersonID, 
        PersonName = g.Key.PersonName, 
        DOB = g.Key.DOB, 
        Status = g.Key.Status, 
        Notes = g.OrderBy(i => i.LineNo).Select(i=> i.NoteText) 
       }).AsEnumerable() 

      .Select(item => new PersonNoteDTO { 
       PersonID = item.PersonID, 
       PersonName = item.PersonName, 
       DOB = item.DOB, 
       Status = item.Status, 
       Notes = string.Join(", ", item.Notes) 
      }).ToList(); 

Wenn alle diese Eigenschaften sind in der Tat ein Teil der Person Klasse, dann können Sie auch nur GroupJoin:

var result = (from p in db.Persons 
       join n in db.Notes on p.PersonID equals n.PersonID into personNotes 
       select new 
       { 
        Person = p, 
        Notes = personNotes.OrderBy(pn => pn.LineNo).Select(pn => pn.NoteText) 
       }).AsEnumerable() 
      .Select(item => new PersonNoteDTO { 
       PersonID = item.Person.PersonID, 
       PersonName = item.Person.PersonName, 
       DOB = item.Person.DOB, 
       Status = item.Person.Status, 
       Notes = string.Join(", ", item.Notes) 
      }).ToList(); 

Aber ich schlage vor, dass Sie lo ok in Navigationseigenschaften. Dann brauchen Sie nicht einmal den Beitritt. Haben Sie einfach eine .Include

+0

und wie wäre es mit der Bestellung von LineNo, um die richtige Reihenfolge der Zeilen zu gewährleisten? – ElenaDBA

+0

Ich habe einen Fehler bekommen 'Kann Typ nicht implizit konvertieren '' zu 'Int'' – ElenaDBA

+0

@ElenaDBA - zurück - Update überprüfen –

Verwandte Themen