EF过滤子收集和孙子收集

本文关键字:过滤 EF | 更新日期: 2023-09-27 18:13:26

我使用实体框架(版本6)与ODP.net (for oracle)

从Courses到Lectures到Lecturetags,我有一对多的关系。

我有一个搜索表单,用户可以通过coursenname, lecturename或lecturetags等进行搜索。

我很难过滤出来,只显示通过搜索条件的课程/讲座,只显示那些。

这是我最初尝试的

 IQueryable<COURSES> result = db.Courses.AsQueryable();
 public IQueryable<COURSES> GetCourseDetails(SearchModel searchModel) 
 {
    if (!string.IsNullOrEmpty(searchModel.CourseName))
      result = result.Where(x => COURSE_NAME.Contains(searchModel.CourseName));
    if (!string.IsNullOrEmpty(searchModel.LectureName))
       result = result.Where(x => x.LECTURES.Any(y => y.LEC_NAME.Contains(searchModel.LectureName)));
 }

显然这不起作用,因为它实际上没有过滤parent=>Child。(这将加载所有的lecture子对象)

将返回类型转换为IEnumerable,看看我是否只能获取相关实体…但这也不工作,我得到相同的搜索结果。
 if (!string.IsNullOrEmpty(searchModel.LectureName))
      {
          var searchResult = from course in db.COURSES
                             select new
                                {
                                  course,
                                  lectures = from lecture in course.LECTURES
                                  where  lecture.LEC_NAME.Contains(searchModel.LectureName)
                                  select lecture
                                };
          result = searchResult.AsEnumerable().Select(c => c.course);
        }

我是EF的新手,所以我不确定做这件事的最好方法是什么?我有几个相关的表,我试图看看什么是最好的方式过滤出来。

另一种选择是获取所有具有讲座名称的课程,并在表示层再次过滤它们。

更新通过添加 这一行,我能够使第二种方法工作
  db.Configuration.LazyLoadingEnabled = false;

然而,我正在寻找方法来使用从上面生成的IEnumerable结果用于进一步过滤,如LectureTags(带来那些讲座,有一个指定的讲座名称以及指定的讲座标签)

EF过滤子收集和孙子收集

看起来你基本上是在正确的轨道上。请尝试以下EF代码,并让我知道是否有效。我知道,当使用MSSQL作为您的数据提供者时,您可以在EF查询中包含string.IsNullOrEmpty,但我不确定这是否适用于Oracle。

public IEnumerable<COURSES> GetCourseDetails(SearchModel searchModel) 
{
    // Not sure what your database context is named, but use the correct name here
    using (var db = new DatabaseContext())
    {
        var coursesToReturn = db.Courses.Where(c =>
             (string.IsNullOrEmpty(searchModel.CourseName) || c.COURSE_NAME.Contains(searchModel.CourseName)) &&
             (string.IsNullOrEmpty(searchModel.LectureName) || c.LECTURES.Any(l => l.LEC_NAME.Contains(searchModel.LectureName)) &&
             (string.IsNullOrEmpty(searchModel.LectureTag) || c.LECTURES.Any(l => l.LECTURE_TAGS.Any(lt => lt.TAG_NAME.Equals(searchModel.LectureTag))));
        return coursesToReturn.AsEnumerable();
    }
}