这个问题有点像那个问题的续集。
当我们想要构建一个处理某种数据的 WCF 服务时,我们自然希望它快速高效。为了实现这一点,我们必须确保数据之旅的所有部分都尽可能快地工作,从 SQL Server 等数据存储后端到请求该数据的 WCF 客户端。
在寻求上一个问题的答案时,我们了解到,感谢Slauma和其他通过评论做出贡献的人,Entity Framework 的(第一个)大型查询的耗时部分是对象物化并将实体附加到上下文,当结果来自返回数据库。我们已经看到,在后续查询中,一切都运行得更快。
假设这些大型查询用作只读操作,我们得出的结论是我们可以将 EF 设置MergeOption
为NoTracking
,从而产生更好的首次查询性能。我们所做的NoTracking
是告诉 EF 为从数据库中检索到的每条记录创建单独的对象 - 即使它们具有相同的键。如果我们.Include()
的查询中有语句,这将导致额外的处理,这将导致返回更大尺寸的数据。
数据可能是如此之大,以至于我们可以很容易地问自己——我们是否真的通过使用NoTracking
选项来帮助我们的事业,即使我们使查询更快(可能只有第一个,取决于.Include()
语句的数量,因为后续查询没有NoTracking
选项使用多个.Include()
语句运行得更快仅仅是因为NoTracking
选项会导致在数据从服务器返回时创建更多的对象)?
最大的问题是如何有效地序列化这些数据量——并在客户端进行反序列化。序列化已经很慢了(我使用DataContractSerializer
with PreserveObjectReferences
set totrue
是因为我将 EF 4.x 生成的 POCO 发送给我的客户端,反之亦然),我们是否想要生成更多数据(感谢NoTracking
)?老实说,我还没有看到来自查询的数据,该查询带有NoTracking
~11.000 个对象的选项,不包括通过 获得的导航属性.Include()
,但尚未到达客户端。上次我试图解决这个问题时,触发了 00:10:00 的超时(!)
所以如果你还在看这面文字墙,你告诉我如何解决这种情况。使用哪个序列化程序来获得可接受的结果?目前,如果我不使用该NoTracking
选项,则 ~11.000 的序列化、传输和反序列化,通过wsHttpBinding
本地机器上的类似自定义绑定需要 ~5 秒。让我害怕的是,这个大表最终很可能会包含约 500.000 条记录。