2017-04-11 42 views
3

我有一个传统的类数据库,由以下模型表示。实体框架如何通过导航属性的属性过滤我的结果?

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。任何帮助表示赞赏。

+0

请阅读[问]并提供[mcve]。这段代码不会编译,更不用说返回一个空列表('Where()'不会返回'List ')。你太简化了这个例子。你显示的原则应该工作。 – CodeCaster

+1

您是否尝试仅运行w.Attendees.Any(a => a.Student.Name.IndexOf(searchString)并调试它?您确定它不是空的吗?您的构造是正确的,您正在检查是否有任何项目参加者有名字包含一个字符串的学生 – victor

+1

应该是:a.Student.Name.Contains(searchString) – jdweng

回答

2

尝试仅仅w.Attendees.Any(a => a.Student.Name.IndexOf(searchString)运行和调试,因为Attendees可能为空或空的,同样适用于该Student财产。

此外,在起飞的机会,你的数据库是不区分大小写,你应该考虑改变你的代码,以反映:

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

的情况下敏感性可能是你的问题的根源太。

-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(); 
相关问题