2013-04-23 42 views
3

在MVC4项目,使用代码首先,我有以下几点:的LINQ与where子句中许多一对多EF代码优先对象

public class Course 
{ 
    public string CourseId { get; set; } 
    public string Name { get; set; } 
    public bool IsActive { get; set; } 

    public virtual Categories ICollection<Category> { get; set; } 

    public Course() 
    { 
     Categories = new HashSet<Category>(); 
    } 
} 

public class Category 
{ 
    public string CategoryId { get; set; } 
    public string Name { get; set; } 

    public virtual Courses ICollection<Course> { get; set; } 

    public Category() 
    { 
     Courses = new HashSet<Course>(); 
    } 
} 

代码第一次那么正确此关系创建一个额外的表,因为它是多对多的。

我的问题是当我需要活动课程的类别列表(IsActive == true)。这里,例如,这是不可能的:

var categories = db.Categories.Where(x => x.Courses.Where(y => y.IsActive)).ToList(); 

任何输入如何获得只有活动课程的类别列表?

谢谢!

回答

4

此查询将返回至少有一个当然是积极的所有类别:

var categories = db.Categories 
    .Where(x => x.Courses.Any(y => y.IsActive)) 
    .ToList(); 

这个查询将返回其课程是所有活动的所有类别。如果,例如,一类有两个课程和课程之一是无效的,该类别将被排除查询:

var categories = db.Categories 
    .Where(x => x.Courses.All(y => y.IsActive)) 
    .ToList(); 
+0

试了一下,它包括所有的那些地方IsActive是假的为好。 – Anders 2013-04-23 04:24:30

+0

该查询将包含一个至少有一个活动课程的类别。如果至少有一个不活动的课程,您是否希望排除一个类别? – 2013-04-23 04:38:16

+0

不,我想查看所有有课程的类别,但不包括不活动的课程。 – Anders 2013-04-23 12:20:44