c# – 在Entity Framework中使用简单查询,性能非常差

c# – 在Entity Framework中使用简单查询,性能非常差,第1张

概述所以我有一个非常简单的结构: >我的订单具有唯一的OrderNumber >订单有很多OrderRows > OrderRows有许多RowExtras,它们有2个字段,position(OrderRow中RowExtra的序列号)和Info,它是一个字符串. OrderRow通常没有多个RowExtra. (现在不要介意愚蠢的结构,它就是这样的). 所以现在我得到一个具有三个属性的对象列表: > 所以我有一个非常简单的结构:

>我的订单具有唯一的OrderNumber
>订单有很多OrderRows
> OrderRows有许多RowExtras,它们有2个字段,position(OrderRow中RowExtra的序列号)和Info,它是一个字符串. OrderRow通常没有多个RowExtra.

(现在不要介意愚蠢的结构,它就是这样的).

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

> OrderNumber
>立场
>信息

我想要做的只是1)检查数据库中是否存在具有给定OrderNumber / position -pair的RowExtra,如果存在,则2)更新Info-property.

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

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

以上是内存溢出为你收集整理的c# – 在Entity Framework中使用简单查询,性能非常差全部内容,希望文章能够帮你解决c# – 在Entity Framework中使用简单查询,性能非常差所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1228922.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存