C# 是否重复调用DataContext.GetChangeSet()性能?

C# 是否重复调用DataContext.GetChangeSet()性能?,c#,.net,linq,linq-to-sql,datacontext,C#,.net,Linq,Linq To Sql,Datacontext,我似乎找不到关于LINQtoSQL的DataContext类的GetChangeSet()函数性能的文档。我在我们自己的组织中看到了很多代码,并且在web上发布了对GetChangeSet()的重复调用,好像它对性能没有影响(而不是缓存第一次调用的值)。我知道它可以做大量的工作,但在以后的通话中是否会跳过它?例如,如果我看到循环中引用的GetChangeSet()。插入,那么在代码审查期间我应该有多担心?在缓存不是一件简单的事情的情况下,应该在缓存GetChangeSet的结果上投入多少精力?我

我似乎找不到关于LINQtoSQL的DataContext类的GetChangeSet()函数性能的文档。我在我们自己的组织中看到了很多代码,并且在web上发布了对GetChangeSet()的重复调用,好像它对性能没有影响(而不是缓存第一次调用的值)。我知道它可以做大量的工作,但在以后的通话中是否会跳过它?例如,如果我看到循环中引用的GetChangeSet()。插入,那么在代码审查期间我应该有多担心?在缓存不是一件简单的事情的情况下,应该在缓存GetChangeSet的结果上投入多少精力?

我根本不希望执行重复调用


根据,
GetChangeSet()
在每次调用时重新计算列表

我根本不希望重复的呼叫会被执行


根据,
GetChangeSet()
在每次调用时重新计算列表

我认为缓存值是危险的。GetChangeSet()返回的值很容易更改。出于同样的原因,每次调用GetChangeSet()时,它都会在内部完成全部工作。我认为一个更好的解决方案是重新思考为什么频繁调用GetChangeSet()。@hatchet如果没有触及跟踪的对象,它不需要做任何工作。在很多情况下,我可以很容易地知道没有被跟踪的物体被触摸过。例如,从变更集中连续获取插入、更新和删除集合。您是否进行过分析,以确定调用GetChangeSet的时间是否值得为DataContext的典型使用担心(因为执行时间可能非常依赖于内部跟踪的对象数)?@hatchet我没有做任何评测,因为我问这个问题的目的是确定当我看到GetChangeSet可能经常被调用的情况时,我是否应该在一般的代码审查期间关注。我担心,如果我分析一个案例,我将无法涵盖所有可能会审查其代码的情况。所以我更愿意从更高的层次来理解它。我不可能对我回顾的每一段代码都进行评测,所以我真的需要理解什么时候我需要关注某个特定案例的评测结果,而不是“盲目”的结果。我认为缓存该值是危险的。GetChangeSet()返回的值很容易更改。出于同样的原因,每次调用GetChangeSet()时,它都会在内部完成全部工作。我认为一个更好的解决方案是重新思考为什么频繁调用GetChangeSet()。@hatchet如果没有触及跟踪的对象,它不需要做任何工作。在很多情况下,我可以很容易地知道没有被跟踪的物体被触摸过。例如,从变更集中连续获取插入、更新和删除集合。您是否进行过分析,以确定调用GetChangeSet的时间是否值得为DataContext的典型使用担心(因为执行时间可能非常依赖于内部跟踪的对象数)?@hatchet我没有做任何评测,因为我问这个问题的目的是确定当我看到GetChangeSet可能经常被调用的情况时,我是否应该在一般的代码审查期间关注。我担心,如果我分析一个案例,我将无法涵盖所有可能会审查其代码的情况。所以我更愿意从更高的层次来理解它。我不可能对我回顾的每一段代码都进行评测,所以我真的需要理解,在没有特定案例的评测的“盲”结果的情况下,什么时候我需要关注。因此,Shaul在回答他自己的问题时做了一些非常糟糕的事情,因为他可以轻松地缓存GetChangeSet的结果以收集插入,从中删除和更新,但他却不必要地调用了3次(甚至更多)?我希望DataContext能够有某种机制来注意到自上次调用以来没有发生跟踪的更改,并且不需要做那么多的工作。我不认为数据库往返是基于GetChangeSet的副作用之一。你有证据支持吗?@BlueMonkMn你是对的。我误读了评论部分的第一个要点。编辑以修复。我也不认为不能保证连续两次调用将返回相同的结果。根据最后一个项目符号,“在调用时计算更改的对象集。如果进行其他更改,对SubmitChanges的后续调用可能会生成不同的集合。”因此,我希望连续调用(在没有进行其他更改的情况下)会返回相同的结果。@BlueMonkMN-“我希望DataContext能够有某种机制来发现自上次调用以来没有发生跟踪的更改,并且不必做那么多工作。”使用Reflector,它似乎没有您希望的机制。您可以对此进行简单的定时测试。读取大量行(>=100000),修改一组,然后比较执行背对背GetChangeSet调用的时间,看看第二个调用是否比第一个调用快。因此,Shaul在回答自己问题时的方式做了一些非常糟糕的事情,因为他可以轻松地缓存GetChangeSet的结果以收集插入、删除和更新,但是他叫了三次(甚至更多)不必要的?我希望DataContext会有某种机制来注意到自上次调用以来没有发生跟踪的更改,并且不必做那么多工作。我不相信数据库往返是GetChangeSet的副作用之一。你有任何证据支持这一点吗?@BlueMonkMn你是对的。我错了阅读备注部分的第一个要点。编辑以修复。我也不认为不能保证两个连续的c