gpt4 book ai didi

c# - 使用 Entity Framework 如何在没有大量查询结果集或数百个小查询的情况下创建嵌套对象?

转载 作者:行者123 更新时间:2023-12-04 02:33:06 24 4
gpt4 key购买 nike

我正在使用 EF 填充对象,然后在我的业务层代码中与之交互。这些对象有多个级别,但我们首先将其简化为一个典型的主从示例,其中包含 OrderOrderLine

假设我需要检索 50 个订单,每个订单有大约 100 个订单行,我需要所有这些数据。在 EF 中执行此操作的最有效方法是什么?

如果我这样做:

var orders = context.Orders.Where(o => o.Status == "Whatever")
.Include(order => order.OrderLines)
.ToList();

然后它会运行一个查询,返回 50x100 行,然后巧妙地将其组合成 50 个 Order 对象,每个对象都有自己的 OrderLine 对象。

如果我不执行 Include() 并且稍后迭代每个 Order 及其 OrderLines,那么它将发出 50 个单独的查询以获取 OrderLine 数据,即每个 Order 一个。

到目前为止,.Include() 看起来很棒:我从 SQL 中提取的数据比需要的多一点,但这比发出 50 个额外的查询要好得多。但是有没有一种方法可以让我选择发出 2 个查询,一个获取 Order,一个获取 OrderLine,然后让 EF 自动连接对象?

我想要的更现实的场景是数据更复杂。假设我想要这样的对象(其中 Product 是在 OrderLine 中购买的东西,ProductPart 是用于制作产品):

- Order
- OrderLine (avg 100 per Order)
- Product (1 per OrderLine)
- ProductPart (avg 20 per Product)

现在,如果我对 ProductPart 执行 .Include(),它会使查询结果变得更大。或者,如果我不使用 Include(),那么它将针对每个 Product 发出单独的查询。

有没有第三种方法,我可以在一个查询中获取所有 OrderOrderLineProduct 数据以及所有 另一个查询中的 ProductPart 数据,并神奇地让 EF 为我连接对象?

更新:

我刚刚读到 AsSplitQuery()这似乎是我正在寻找的东西,但仅在 EF Core 5 中可用,该 EF Core 5 直到 2020 年 11 月才稳定(?)。我正在寻找一种在 EF6 中实现此目的的方法。

经过更多研究,我发现了 https://entityframework.net/improve-ef-include-performance当您有多个对象类型脱离父对象时,这建议了两种方法:

  1. 执行多个 EF 命令以拉回相同的父对象列表,但每次 Include() 都包含不同的子对象类型。显然,EF 将连接它已经从数据库中提取的相关对象。

  2. 使用 EF+ 库,它似乎可以执行类似 AsSplitQuery()

    的操作

我不确定这是否适用于我的情况,那里有更多级别的嵌套,而不仅仅是来自父对象的不同类型的对象。我的猜测是肯定的,如果我对此很聪明的话。有什么建议吗?

最佳答案

类似这样的事情可能会稍微破坏您的对象结果,但应该执行两个单独的查询。

var ordersQuery = context.Orders.Where(o => o.Status == "Whatever");

var orderLineGroups = ordersQuery
.SelectMany(o => o.OrderLines)
.ToLookup(l => l.OrderID); // <- Not sure what your FK name is

var orders = ordersQuery.Select(o => new {
Order = o,
OrderLines = orderLineGroups[o.Id]
}).ToList();

关于c# - 使用 Entity Framework 如何在没有大量查询结果集或数百个小查询的情况下创建嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63063866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com