2017-02-27 1 views
1

Ich habe eine Liste mit ca. 120.000 Objekte. Aus dieser Liste möchte ich Daten extrahieren, um Personen und Subskriptionsobjekte zu erstellen. Logik ist, dass 1 Person 1 oder mehr Zeitungsabonnements haben kann.LINQ-Abfrage mit if-statment

Ich habe Schwierigkeiten, eine Linq-Abfrage zu schreiben, die nur dann ein neues Person-Objekt hinzufügt, wenn es noch nicht erstellt wurde. In Pseudo wie Code etwas wie folgt aus:

persons.Select(x => 

if (PersonIsAdded(x)) 
{ 
    var person = GetPerson(x); 
    person.Address = "XXX"; 
    person.SubscriptionList.Add{new subscription() {Name = "newspaperName} 
} 
else 
{ 
    new Person{ Address = "XYZ", SubscriptionList.Add{new subscription() {Name =  
    "newspaperName"} } 
).ToList(); 
+0

Dies ist nicht die Art, diese Objekte zu erstellen. Sie benötigen eine 'GroupBy' und erstellen das gesamte Los in einer einzigen Abfrage. Kannst du den Rest des Codes zeigen, damit wir dir eine gute Lösung geben können? – Enigmativity

+0

Es wäre auch toll, wenn Sie tatsächlich gültigen C# -Code veröffentlicht hätten. Etwas, mit dem wir mit wenig Aufwand arbeiten können. – Enigmativity

+0

Gibt es einen Grund dafür, dass dies LinQ sein muss? Kannst du zuerst eine 'foreach'-Schleife erstellen? Es wird definitiv besser für Ihr Verständnis sein, als eine LinQ-Anweisung zu kopieren. – nvoigt

Antwort

0

Wenn ich die Frage richtig verstehe Sie so etwas wie

var person = persons.FirstOrDefault(x => x.Id == yourId); 

if (person == null) 
{ 
    // create new person with subscription 
} 
else 
{ 
    person.SubscriptionList.Add(subscription) 
} 
tun könnte

dies vorausgesetzt, Sie eine Kennung für Ihre Person Objekt haben

0

Gegeben den Code, den Sie uns gezeigt haben (ignorieren die komplizierte ObjectMapper) dann schlage ich vor, dass Ihr Code könnte so aussehen:

persons.Select(x => 
{ 
    if (PersonIsAdded(x)) 
    { 
     var person = GetPerson(x); 
     person.Address = "XXX"; 
     person.SubscriptionList.Add(
      new subscription() { Name = "newspaperName " }); 
     return person; 
    } 
    else 
    { 
     return new Person() 
     { 
      Address = "XYZ", 
      SubscriptionList = new [] 
      { 
       new subscription() { Name = "newspaperName" } 
      }.ToList(), 
     } 
    } 
}).ToList(); 

Das scheint jedoch nur falsch. Der Code sollte etwas so einfache wie dies in der Lage sein:

List<Person> query = 
(
    from x in persons 
    join n in subscriptions on x equals n.Id into subs 
    select new Person() 
    { 
     Address = x.Address, 
     SubscriptionList = 
      subs 
       .Select(y => new subscription() { Name = n.Name }) 
       .ToList(), 
    } 
).ToList(); 

Aber Sie haben uns nicht die richtige Menge an Details gegeben, um sicherzustellen, dass dies richtig ist oder nicht.

+0

Das erste Beispiel, das ich gab, war, wie ich schrieb, Pseudocode. Ich möchte kein Personenobjekt für jedes Objekt in Personen erstellen. Ich möchte nur ein Personenobjekt erstellen, wenn es zuvor nicht hinzugefügt wurde. Ich denke Gruppe für Aussage kann hier hilfreich sein. – Kran

+0

@Kran - Die Frage wurde mit C# getaggt - benutze keinen Pseudo-Code, es sei denn du bist dir sehr sicher, dass das deine Absicht war. Dies wird jedoch die Anzahl der Personen verringern, die versuchen zu antworten. – Enigmativity