如何在实体框架中使用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"); 
+0

闵采尔,这工作就像一个魅力。这就是我一直在寻找的东西,尤其是通用零件。有没有办法一次加载所有的Child对象?我认为对于这种情况,我们必须编写单独的查询。 – Tech

+0

我认为一个更好的做法是启用延迟加载[阅读此](http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx),这种方式应该工作。 – Munzer

+0

我很高兴我帮助:) – Munzer

如果你想有一个或多个相关课程,所有的作家,那么你需要

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