2016-06-10 7 views
0

Ich versuche, einen Bereich von Werten aus vier verschiedenen Liste von Objekten zu einer Liste hinzuzufügen. Dies ist der Code, den ich all Elemente aus einer Liste von Objekten hinzuzufügen habe ...Linq - mehrere verschiedene Objekte zu einer Liste hinzufügen

var formList = new List<FormList>(); 

    formList = forms.LimitedWillForms.Select(a => new FormList() 
       { 
        DateCreated = a.CreationDate, 
        FormId = a.Id, 
        FormType = a.FormType, 
        Submitted = a.SubmissionDate != null 
       }).ToList(); 

Ich versuche nur, um nicht aus der forms.LimitedWillForms Liste hinzufügen, sondern auch von dem forms.FullWillForms und der forms.FullWillForms2 und die Formulare.FullWillForms3, die dieselben Parameter hinzufügen. Dies scheint zu funktionieren, um ausgewählte Parameter aus dem Formular zur Liste hinzuzufügen.

Ich bin mir nicht sicher über die effizienteste Möglichkeit, linq zu verwenden, um ausgewählte Parameter aus allen vier Listen zur formList hinzuzufügen. Kann jemand helfen?

+0

Sie wollen nur mehrere Listen zusammenführen? – DavidG

+0

nur 4 Parameter von jedem Element in jeder Liste, alle in einer einzigen Liste - dh es könnte zwanzig Eigenschaften in jedem Objekt in der Liste (und jede Liste wird verschiedene Objekte in, aber mit einigen Parametern die gleichen haben), aber ich Ich möchte nur das Erstellungsdatum, die ID, den Typ und ob es gesendet wurde oder nicht, welches in jedem Objekt in jeder Liste verfügbar sein wird. – user3429672

+0

Enthält die Liste Objekte des gleichen Typs? – Magnus

Antwort

1

Da die Listen Objekte unterschiedlicher Typen Ihre beste Möglichkeit wäre, enthalten eine gemeinsame Schnittstelle für alle Arten für die gemeinsamen Eigenschaften hinzuzufügen.

public interface IRecord 
{ 
    DateTime DateCreated {get;set;} 
    int FormId {get;set;} 
    .... 
} 

Anschließend können Sie tun:

var formList = forms.LimitedWillForms 
       .Cast<IRecord> 
       .Concat(forms.FullWillForms) 
       .Concat(forms.FullWillForms2) 
       .Concat(forms.FullWillForms3) 
       .Select(x => new FormList() 
       { 
        DateCreated = x.CreationDate, 
        FormId = x.Id, 
        FormType = x.FormType, 
        Submitted = x.SubmissionDate != null 
       }).ToList(); 

Wenn Sie mit nur immer wieder eine Liste, wenn IRecord statt FormList Sie tatsächlich die letzte select.

überspringen leben können, wenn dies nicht möglich ist Sie müssten die Eigenschaften aus jeder Sammlung auswählen.

var formList = forms.LimitedWillForms.Select(x => new FormList() 
       { 
        DateCreated = x.CreationDate, 
        FormId = x.Id, 
        FormType = x.FormType, 
        Submitted = x.SubmissionDate != null 
       }).Concat(
        forms.FullWillForms.Select(x => new FormList() 
        { 
         DateCreated = x.CreationDate, 
         FormId = x.Id, 
         FormType = x.FormType, 
         Submitted = x.SubmissionDate != null 
        } 
       ).Concat(...).ToList(); 
+0

Hallo - ich habe das mit Ihrer zweiten Methode zu arbeiten. Ich glaube nicht, dass ich das erste verwenden kann, da die Formulare aus dem Entity Framework stammen. Wissen Sie von Anfang an, ob Entity-Framework-Modelle mit Interfaces arbeiten können? – user3429672

+1

Ich denke, die Entity-Klassen von Entity-Framework generiert werden "teilweise". Das heißt, wenn Sie Ihre eigene Teilklasse mit demselben Namen hinzufügen, die die gewünschte Schnittstelle implementieren kann. – Magnus

0

Versuchen Sie folgendes:

var formList = forms.LimitedWillForms.Select(a => new FormList 
        { 
         DateCreated = a.CreationDate, 
         FormId = a.Id, 
         FormType = a.FormType, 
         Submitted = a.SubmissionDate != null 
        }) 
        .Union(forms.FullWillForms.Select(a => new FormList 
        { 
         DateCreated = a.CreationDate, 
         FormId = a.Id, 
         FormType = a.FormType, 
         Submitted = a.SubmissionDate != null 
        })) 
        .Union(forms.FullWillForms2.Select(a => new FormList 
        { 
         DateCreated = a.CreationDate, 
         FormId = a.Id, 
         FormType = a.FormType, 
         Submitted = a.SubmissionDate != null 
        })) 
        .Union(forms.FullWillForms3.Select(a => new FormList 
        { 
         DateCreated = a.CreationDate, 
         FormId = a.Id, 
         FormType = a.FormType, 
         Submitted = a.SubmissionDate != null 
        })).ToList(); 
+0

Vielen Dank für Ihre Zeit. Diese Lösung erzeugt einen Fehler in jeder Liste (das nicht aufrufbare Member 'Form.LimitedWillForms' kann nicht wie eine Methode verwendet werden.) - Ich bin mir nicht sicher, warum, aber die Magnus-Lösung mit .concat scheint gut zu funktionieren. Vielen Dank. – user3429672

Verwandte Themen