所以我有一个非常简单的结构:
- 我有具有唯一 OrderNumber 的订单
- 订单有很多 OrderRows
- OrderRows 有许多 RowExtra,它们有 2 个字段,位置(OrderRow 中的 RowExtra 的序列号)和 Info,它是一个字符串。通常,一个 OrderRow 不会有多个 RowExtra。
(现在不要介意愚蠢的结构,它就是这样)。
所以现在我得到一个具有三个属性的对象列表:
- 订单号
- 位置
- 信息
我想要做的只是 1)检查具有给定 OrderNumber/Position 对的 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 个 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);
然后为列表中的每个对象调用所述查询。但即使是这种方法也需要一分钟多的时间。那么我如何才能让这个东西在合理的时间范围内运行呢?
另外,我很抱歉解释过长,但希望有人能帮助我!