EF过滤子集合和孙子集合

时间:2016-10-17 14:30:10

标签: c# asp.net-mvc linq entity-framework-6 odp.net

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

我有从课程到讲座到讲座的一对多关系。

我有一个搜索表单,用户可以通过coursename,讲义名称或讲座等进行搜索..

我很难过滤掉并只显示符合搜索条件的课程/讲座,只展示那些。

这是我最初尝试的内容

 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 =&gt; Child。(这会加载所有讲座子对象)

所以我尝试了这个..将返回类型转换为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(带来具有指定讲座名称的讲座以及指定的讲义标签)

1 个答案:

答案 0 :(得分:0)

看起来你大部分都在正确的轨道上。请尝试以下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();
    }
}