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代码,并让我知道是否有效。我知道,当使用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();
}
}