【问题标题】:EF filtering child collection and grandchild collectionEF过滤子集合和孙集合
【发布时间】:2016-10-17 14:30:10
【问题描述】:

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

从课程到讲座再到 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)));
 }

显然这不起作用,因为它实际上没有过滤父级=>子级。(这会加载所有讲座子对象)

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

【问题讨论】:

  • 您是要返回课程列表还是讲座列表?还是包含两者并将它们包装在共享界面(或类似的东西)中的组合列表?
  • 课程列表

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


【解决方案1】:

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

【讨论】:

  • 这不起作用..可能是因为 Oracle 的缘故?这只是返回所有课程的列表。 (它也不会带来讲座)
猜你喜欢
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
相关资源
最近更新 更多