Gabriels的回答是正确的:使用编译的查询。
看起来你正在为每个WCF请求再次编译它,这当然会破坏一次性初始化的目的。而是将编译的查询放入静态字段。
编辑:
执行此操作:向服务发送最大负载并暂停调试器10次。看看调用堆栈。在L2S代码或ADO.NET代码中它是否经常停止?这将告诉您问题是否仍然存在于L2S或SQL Server中。
接下来,让我们修复过滤器。我们需要将其推回到已编译的查询中。这只能通过改变这个来实现:
rolIds.Contains(role.FIDROLE)
对此:
role.FIDROLE == rolIds_0 || role.FIDROLE == rolIds_1 || ...
对于rolIds的每个基数,您需要一个新的编译查询。这很讨厌,但有必要让它编译。在我的项目中,我已经自动执行了此任务,但您可以在此处执行一次性解决方案。
我猜大多数查询都只有很少的角色ID,所以你可以实现10个基数1-10的编译查询,如果基数超过10,你就会回到客户端过滤。
如果您决定将查询保留在代码中,则可以编译它。在运行应用程序时,您仍然需要编译一次查询,但所有后续调用都将使用已编译的查询。您可以在这里查看MSDN帮助: http://msdn.microsoft.com/en-us/library/bb399335.aspx 。 另一种选择是使用存储过程并从代码中调用该过程。因此没有编译时间。