【发布时间】: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