如何在 Entity Framework 中使用 lambda 表达式和谓词

How to use lambda expressions and predicates with Entity Framework

我不熟悉将 lambda 表达式与 Entity Framework 结合使用,非常感谢这方面的帮助。

在我的项目中,我有两个实体 AuthorCourse 具有 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);
    }

我不确定如何定义 returns parent/child 对象的 Get(...) 方法。有人可以在这方面指导我吗?

提前致谢。

您正在寻找的是简单的 linq,

context.Authors.Include(A => A.Courses).ToList();

这将 return 您所有的作者及其课程。

如果你想要一个通用的,

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();

如果您还想 return 您可以使用的课程 Include

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();