实体框架如何通过导航属性的属性过滤我的结果?

时间:2017-04-11 14:07:14

标签: c# entity-framework linq

我有一个遗留类数据库,由以下模型表示。

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; }
}

我需要获得课程标题或说明的一部分或学生姓名的一部分与我的搜索字符串匹配的课程列表。第一部分很简单。

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

我现在如何过滤w.Attendees.Student.Name?

我试过了:

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();

它只返回一个空列表。

我仍然对Linq有点新意,我来自Grails。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

尝试仅运行w.Attendees.Any(a => a.Student.Name.IndexOf(searchString)并进行调试,因为Attendees可能为null或为空,Student属性也是如此。

此外,如果您的数据库不是不区分大小写,则应考虑更改代码以反映:

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

案例敏感度可能也是您问题的根源。

答案 1 :(得分:-2)

试试这个:

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();