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.
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
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
Sollte sein: a.Student.Name.Contains (searchString) – jdweng