如何在实体框架

时间:2017-05-26 19:16:27

标签: generics lambda asp.net-mvc-5 entity-framework-6 extension-methods

我不熟悉在实体框架中使用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(...)方法。有人可以在这方面指导我。

提前致谢。

2 个答案:

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