【问题标题】:Linq with where clause in many-to-many EF Code First object多对多 EF Code First 对象中带有 where 子句的 Linq
【发布时间】:2013-04-16 03:50:18
【问题描述】:

在 MVC4 项目中,首先使用代码,我有以下内容:

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

Code First 然后正确地为这个关系创建一个额外的表,因为它是多对多的。

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

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

任何输入如何获得仅包含活动课程的类别列表?

谢谢!

【问题讨论】:

    标签: linq entity-framework asp.net-mvc-4 ef-code-first


    【解决方案1】:

    此查询将返回至少有一个活动课程的所有类别:

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

    【讨论】:

    • 试过了,它也包括了所有 IsActive 为假的。
    • 查询将包括一个类别,该类别至少有一个活动课程。如果某个类别至少有一个不活动的课程,您要排除它吗?
    • 不,我想查看所有有课程的类别,但不包括不活跃的课程。
    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多