2016-10-14 8 views
0

Ich werde zuerst Code zeigen, und dann versuche ich zu sagen, was ich will.LINQ Elemente auswählen Liste der Listen

Grundsätzlich möchte ich meinen Thread mit Themen, aber ich brauche nicht alle Themen, ich brauche nur "nicht Werbung" Themen. Das funktioniert für mich, aber ich fühle, dass ich das mit einer Bitte machen kann, aber ich weiß nicht wie.

Ich versuchte dies, aber es funktioniert nicht:

Thread thread = db.Threads 
      .AsNoTracking() 
      .Where(x=>x.Name == name) 
      .Select(x=> new Thread 
      { 
       Topics = x.Topics.Select(x=>x.PinType != PinType.Advertisement) 
      }); 

Modelle:

class Thread { 
    int ThreadId {get;set;} 
    ICollection<Topic> Topics {get;set;} 
} 
class Topic { 
    int TopicId {get;set;} 
    int ThreadId {get;set;} 
    Thread Thread {get;set;}  
    PinType PinType {get;set;} 
} 
+0

Zeigen Sie Ihre Modelle würde helfen, Ihre Beziehungen zu verstehen (und SO ist keine soziale Chat-Website :) –

+0

Nein, das wird nicht funktionieren. Ich kann Topics.PinType nicht verwenden, da Topics is Collection ist, brauche ich Topic, um PinType zu überprüfen. – Evgenii

+0

Dann müssten Sie eine '.Where (x => x.Topics.Any (y => y.PinType! = PinType.Advertisement)) ' –

Antwort

0
Thread thread = db.Threads 
     .AsNoTracking() 
     .Where(x=>x.Name == name) 
     .Select(x=> new Thread 
     { 
      Topics = x.Topics.Select(x=>x.PinType != PinType.Advertisement) 
     }); 

Die linke Seite ist Thema, wo die rechte Seite IEnumberable ist. Und du vermisst auch die ID in neuem Thread. es ändern:

var threads = db.Threads 
     .AsNoTracking() 
     .Where(x=>x.Name == name) 
     .Select(x=> new Thread 
     { 
      ThreadId = x.ThreadId, 
      Topics = x.Topics.Where(x=>x.PinType != PinType.Advertisement).ToList() 
     }); 

Vielleicht brauchen Sie

Thread thread = threads.FirstOrDefault(); 

Dann können wir dies zu

vereinfachen
Thread thread = db.Threads 
     .AsNoTracking() 
     .Where(x=>x.Name == name) 
     .Select(x=> new Thread 
     { 
      ThreadId = x.ThreadId, 
      Topics = x.Topics.Where(x=>x.PinType != PinType.Advertisement).ToList() 
     }).FirstOrDefault(); 
+0

Topics = x.Topics.Select (x => x.PinType! = PinType.Advertisement) hier Fehler, kann IEnumerable zu ICollection nicht konvertieren. Und wenn ich Where anstelle von Select verwende, kann IEnumerable nicht in ICollection konvertiert werden. – Evgenii

+0

Entschuldigung, es sollte wo sein. Ich werde meine Antwort bearbeiten –

0

Dies funktioniert wie ich wollte. Zuerst suche ich nach Thread, den ich brauche, und nachdem ich es gefunden habe - entferne ich einige Themen daraus. Ich wollte das in einer Anfrage machen, aber ich denke das ist auch ok.

Verwandte Themen