我不熟悉在实体框架中使用lambda表达式,并会在这方面给予一些帮助。
在我的项目中,我有两个实体作者和课程与1-M关系(作者可以有多个课程):
public class Author
{
public int AuthorId {get; set;}
public string Name {get; set;}
public virtual ICollection<Course> Courses {get; set;}
}
public class Course
{
public int CourseId {get; set;}
public string Title {get; set;}
public int AuthorId {get; set;}
public virtual Author {get; set;}
}
我想要检索所有具有相关课程的作者 - 同样适用于我项目中的其他实体。出于这个原因,我想要一个类似于以下的Get()方法:
public class GenericService<T> where T : class
{
// DbContext defined
public IEnumerable<T> Get(...)
{
return Context...
}
}
在我的控制器操作中,我会做类似以下的事情:
public ActionResult Get_Authors_With_Courses ()
{
// var authors = Get (...)
return View(authors);
}
我不确定如何定义返回父/子对象的 Get(...)方法。有人可以在这方面指导我。
提前致谢。
答案 0 :(得分:0)
您正在寻找的是简单的linq,
context.Authors.Include(A => A.Courses).ToList();
这将使您的所有作者返回他们的课程。
如果你想要一个通用的,
public class GenericService<T> where T : class
{
// DbContext defined = db
public IEnumerable<T> Get(string pathtoinclude = "")
{
// add checking if path is null remove the Include extension
// path to include in your example is courses
return db.Set<T>().Include(pathtoinclude).AsEnumerable();
}
}
你可以像这样使用它
var authors = Get<Author>("Courses");
答案 1 :(得分:0)
如果您希望所有具有一个或多个相关课程的作者需要
var authorsWithCourses = context.Authors.Where(a => a.Courses.Any()).ToList();
如果您还要返回课程,可以使用包含
var authorsWithCourses = context.Authors
.Include(a => a.Courses)
.Where(a => a.Courses.Any())
.ToList();
虽然我更喜欢通过Include进行投影,所以你可以做类似
的事情var authorsWithCourses = context.Authors
.Where(a => a.Courses.Any())
.Select(a => new {
Author=a.Name,
Courses = a.Courses.Select(c => c.Title)
})
.ToList();