Generics 如何在实体框架中使用lambda表达式和谓词

Generics 如何在实体框架中使用lambda表达式和谓词,generics,lambda,asp.net-mvc-5,entity-framework-6,extension-methods,Generics,Lambda,Asp.net Mvc 5,Entity Framework 6,Extension Methods,我不熟悉在实体框架中使用lambda表达式,希望在这方面能得到一些帮助 在我的项目中,我有两个具有1-M关系的实体作者和课程(一个作者可以有多个课程): 我不知道如何定义返回父/子对象的Get(…)方法。有人能在这方面指导我吗 提前感谢。您要找的是简单的linq context.Authors.Include(A => A.Courses).ToList(); 这将返回所有作者及其课程 如果你想要一个普通的 public class GenericService<T> whe

我不熟悉在实体框架中使用lambda表达式,希望在这方面能得到一些帮助

在我的项目中,我有两个具有1-M关系的实体作者课程(一个作者可以有多个课程):

我不知道如何定义返回父/子对象的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();
    }
}
公共类泛型服务,其中T:class
{
//定义的DbContext=db
public IEnumerable Get(字符串pathtoinclude=“”)
{ 
//添加检查路径是否为null删除包含扩展名
//要包含在示例中的路径是课程
返回db.Set().Include(pathtoinclude.AsEnumerable();
}
}
你可以这样使用它

var authors = Get<Author>("Courses");
var作者=Get(“课程”);

如果您希望所有作者都有一个或多个相关课程,那么您需要

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

Munzer,这很有魅力。这是我一直在寻找的,特别是通用部分。是否有一种方法可以一次性加载所有子对象?我认为在这种情况下,我们必须编写单独的查询。我认为更好的做法是启用延迟加载,这种方式应该可以工作。我很高兴我提供了帮助:)Phil,我喜欢投影的想法。这有助于自定义输出。
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();