使用Entity Framework返回所有相关实体

6

我第一次使用Entity Framework。我正在编写以下简单的查询:

public List<Request> GetResult(string code)
{
    List<Request> requests = new List<Request>();

    using (var db = new Context())
    {
        requests = (from c in db.Requests where c.Code == code select c).ToList();
    }

    return requests;
}

Request对象相关的几个实体,例如与Request表具有1对1关系的Results表。然而,它们都返回null。

我该如何使用Entity Framework查询并返回一个实体及其所有相关实体?

TIA


你使用的是哪个版本的Entity Framework?你能发布一下你的“Request”对象吗? - Steve
https://dev59.com/32Uq5IYBdhLWcg3waPzr - spender
2个回答

10

使用预加载的方式进行单个查询

db.Requests.Where(req => req.Code == code)
    .Include(req => req.Results) // Joining is performed here
    .Include(req => req.SomeOtherProperty)
    .ToList()

使用显式加载的多个查询

// Hits the database once.
var requests = db.Requests.Where(req => req.Code == code).ToList();
var requestIDs = requests.Select(req => req.ID);
// Hits the database another time to load your Results property.
db.Results.Where(res => requestIDs.Contains(res.RequestID)).Load(); 

如果启用了懒加载,每次访问请求列表的结果属性时,都会执行一个查询来从数据库中为您加载它,这可能会导致N+1问题。不过,EntityFramework Core目前还不支持懒加载。

1
在添加了System.Data.Entity命名空间后,您的急切加载示例完美解决了问题。谢谢! - Nugs
1
延迟加载现在可以在EF Core 2.1中使用。 - Dylan Hayes

0
如果您想选择要加载的对象,请使用:
db.Entry(Requests).Reference(p => p.Code).Load(); 

如果您想在数据上下文构造函数中自动加载所有内容,请设置。
this.Configuration.LazyLoadingEnabled = true; 

LazyLoadingEnabled 会针对未加载的虚拟属性问题发出新查询请求。它不会预先自动加载这些属性,正如 OP 所请求的那样。 - spender
默认情况下启用了惰性加载。 - Majid Shahabfar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接