gpt4 book ai didi

c# - Entity Framework 中的简单查询性能非常差

转载 作者:行者123 更新时间:2023-11-30 12:49:54 25 4
gpt4 key购买 nike

所以我有一个非常简单的结构:

  • 我的订单具有唯一的 OrderNumber
  • 订单有很多OrderRows
  • OrderRows 有许多 RowExtras,它们有 2 个字段,position(OrderRow 中 RowExtra 的序号)和 Info,它是一个字符串。通常情况下,一个 OrderRow 不会有多个 RowExtra。

(暂时不要介意这个愚蠢的结构,它就是这样)。

现在我得到了具有三个属性的对象列表:

  • 订单号
  • 职位
  • 信息

我想做的只是 1) 检查数据库中是否存在具有给定 OrderNumber/Position 对的 RowExtra,如果存在,2) 更新信息属性。

我尝试了几种不同的方法来实现这一点,但结果却很糟糕。解决方案循环遍历对象列表并发出查询,例如

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 个 RowExtra,需要更新其中的大约一半。这些方法使程序需要几分钟才能完成,这确实是不能接受的。我不明白的是为什么要花这么长时间,因为返回所需 RowExtra 的 SQL 子句很容易手动编写(where 部分只有 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();

关于c# - Entity Framework 中的简单查询性能非常差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418670/

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