在实体框架中使用简单查询时性能非常差
本文关键字:查询 性能 非常 简单 实体 框架 | 更新日期: 2023-09-27 18:33:09
所以我有一个非常简单的结构:
- 我的订单具有唯一的订单编号 订单
- 具有许多订单行
- OrderRows有许多RowExtras,它们有2个字段,位置(OrderRowRow中RowExtra的序列号(和信息,这是一个字符串。通常情况下,一个 OrderRow 不会有多个 RowExtra。
(现在不要介意愚蠢的结构,它就是这样(。
所以现在我得到了一个具有三个属性的对象列表:
- 订单号
- 位置
- 信息
我想做的只是 1( 检查数据库中是否存在具有给定订单号/位置对的 RowExtra,如果是,则 2( 更新 Info-属性。
我尝试了几种不同的方法来实现这一目标,但充其量效果很差。解决方案循环遍历对象列表并发出查询,例如
myContext.RowExtras.Where(x => x.Position == currentPosition &&
x.OrderRow.Order.OrderNumber == currentOrderNumber)
或从另一边走
myContext.Orders.Where(x => x.OrderNumber == currentOrderNumber)
.SelectMany(x => x.OrderRows)
.SelectMany(x => x.RowExtras)
.Where(x => x.Position == currentPosition)
然后检查计数是否等于 1,如果是,请更新属性,否则继续执行下一项。
我目前数据库中有大约 4000 个 RowExtras,需要更新其中的一半。这些方法使该过程需要几分钟才能完成,这确实是不可接受的。我不明白的是为什么需要这么长时间,因为返回所需 RowExtra 的 SQL 子句很容易手动编写(在 where-part 中只有 2 个连接和 2 个条件(。
我设法实现的最佳性能是使用如下所示的编译查询
Func<MyContext, int, string, IQueryable<RowExtra>> query =
CompiledQuery.Compile(
(MyContext ctx, int position, string orderNumber) =>
from extra in ctx.RowExtras
where
extra.Position == position &&
extra.OrderRow.Order == orderNumber
select extra);
然后为列表中的每个对象调用所述查询。但即使是这种方法也花了一分多钟。那么我如何才能在合理的时间范围内运行这个东西呢?
另外,我很抱歉解释得太长,但希望有人可以帮助我!
尽量减少数据库调用的次数。根据经验,每个至少需要大约 10 毫秒 - 即使是只返回标量。
因此,一般来说,一次性获取您需要的所有数据,在代码中对其进行修改,然后保存。
List<Order> orders = myContext.Orders
.Include( "OrderRows.RowExtras" )
.Where( ... select all the orders you want, not just one at a time ... )
.ToList();
foreach ( Order order in orders )
{
... execute your logic on the in-memory model
}
myContext.SaveChanges();