【问题标题】:Return all related entities with Entity Framework使用实体框架返回所有相关实体
【发布时间】:2017-06-01 23:27:26
【问题描述】:

我是第一次玩实体框架。我正在编写以下简单查询:

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 表具有一对一关系的Results 表。然而他们都回来了。

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

TIA

【问题讨论】:

标签: c# entity-framework


【解决方案1】:

使用预先加载的单个查询

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

如果启用延迟加载,每次访问Request 列表的Results 属性时,都会在数据库上执行查询为您加载它,这可能会导致N+1 问题。延迟加载在 EntityFramework Core 上尚不可用。

【讨论】:

【解决方案2】:

如果要选择要加载的对象,请使用

db.Entry(Requests).Reference(p => p.Code).Load(); 

如果您想在数据上下文构造函数集上自动加载所有内容

this.Configuration.LazyLoadingEnabled = true; 

【讨论】:

  • LazyLoadingEnabled 发出一个新查询以请求一个已卸载的虚拟属性。它不会按照 OP 的要求预先自动加载这些属性。
  • 延迟加载默认开启。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多