如何在实体框架中使用lambda表达式和谓词
问题描述:
我对于在实体框架中使用lambda表达式很感兴趣,并且在这方面会很感谢。如何在实体框架中使用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(...)返回父/子对象的方法。有人可以在这方面指导我。
在此先感谢。
答
你所寻找的是简单的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");
答
如果你想有一个或多个相关课程,所有的作家,那么你需要
var authorsWithCourses = context.Authors.Where(a => a.Courses.Any()).ToList();
如果你还想返回课程,你可以使用包括
var authorsWithCourses = context.Authors
.Include(a => a.Courses)
.Where(a => a.Courses.Any())
.ToList();
虽然我更喜欢在投影通常包含,所以你可以做这样的事情
var authorsWithCourses = context.Authors
.Where(a => a.Courses.Any())
.Select(a => new {
Author=a.Name,
Courses = a.Courses.Select(c => c.Title)
})
.ToList();
+0
菲尔,我喜欢投影的想法。这有助于自定义输出。 – Tech
闵采尔,这工作就像一个魅力。这就是我一直在寻找的东西,尤其是通用零件。有没有办法一次加载所有的Child对象?我认为对于这种情况,我们必须编写单独的查询。 – Tech
我认为一个更好的做法是启用延迟加载[阅读此](http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx),这种方式应该工作。 – Munzer
我很高兴我帮助:) – Munzer