2017-04-11 13 views
3

Ich habe eine Legacy-Klassendatenbank, die durch das folgende Modell dargestellt wird.Entity Framework Wie kann ich meine Ergebnisse nach einer Eigenschaft einer Navigationseigenschaft filtern?

public class Course 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public CourseLevel Level { get; set; } 
    public float FullPrice { get; set; } 
    public Author Author { get; set; } 

    public IList<Tag> Tags { get; set; } 
    public IList<Attendee> Attendees { get; set; } 
} 

public class Attendee 
{ 
    public int Id { get; set; } 
    public int StudentId { get; set; } 
    public decimal Tuition { get; set; } 

    public Student Student { get; set; } 
} 

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

public class Author 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IList<Course> Courses { get; set; } 
} 

public class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IList<Course> Courses { get; set; } 
} 

Ich brauche eine Liste von Klassen zu erhalten, die entweder ein Teil des Kurses Titel oder eine Beschreibung oder einen Teil des Namens des Schülers meine Suchbegriff übereinstimmt. Der erste Teil ist einfach.

List<Course> courses = db.Courses.Where(w => w.Title.IndexOf(searchString) > -1 || w.Description.IndexOf(searchString) > -1).ToList(); 

Wie kann ich jetzt gegen w.Attendees.Student.Name filtern?

Ich habe versucht:

List<Course> courses = db.Courses 
    .Where(w => w.Title.IndexOf(searchString) > -1 || 
      w.Description.IndexOf(searchString) > -1 || 
      w.Attendees.Any(a => a.Student.Name.IndexOf(searchString) > -1)).ToList(); 

Und es gibt nur eine leere Liste.

Ich bin immer noch etwas neu zu Linq, ich komme aus Grails. Jede Hilfe wird geschätzt.

+0

Bitte lesen Sie [fragen] und geben Sie ein [mcve]. Dieser Code wird nicht kompilieren, geschweige denn eine leere Liste zurückgeben ('Where()' gibt keine 'List ' zurück). Sie haben das Beispiel zu sehr vereinfacht. Das Prinzip, das du zeigst, sollte funktionieren. – CodeCaster

+1

Haben Sie versucht, nur w.Attendees.Any (a => a.Student.Name.IndexOf (searchString) zu starten und zu debuggen? Sind Sie sicher, dass es nicht leer ist? Ihr Konstrukt ist korrekt, Sie überprüfen, ob irgendein Element in Teilnehmer hat einen Student, dessen Name eine Zeichenfolge enthält – victor

+1

Sollte sein: a.Student.Name.Contains (searchString) – jdweng

Antwort

2

Versuchen nur w.Attendees.Any(a => a.Student.Name.IndexOf(searchString) laufen und es debuggen, weil Attendees null oder leer sein könnte, und das gleiche gilt für die Student Eigenschaft.

Auch in den unwahrscheinlichen Fall, dass Ihre Datenbank nicht unempfindlich ist Fall sollten Sie Ihren Code zu ändern betrachten zu reflektieren, dass:

w.Attendees.Any(a => a.Student.Name.ToLowerInvariant().Contains(searchString.ToLowerInvariant())

Der Fall Empfindlichkeit könnte die Quelle Ihrer Probleme auch.

-2

Try this:

List<Course> courses = db.Courses 
    .Where(w => w.Title.Contains(searchString)|| 
      w.Description.Contains(searchString) || 
      w.Attendees.Any(a => a.Student.Name.Contains(searchString))).ToList(); 
Verwandte Themen