0

场景:我一直在与托管 WCF 数据服务 3.0 的第三方公司合作,我们只能通过 API 访问他们的 Web 服务,不,我不能通过使用存储过程来加快速度,因为我没有具有 SQL 直接访问权限。

我玩过一点 PFX,尝试将它与 WCF 数据服务一起使用可能会大错特错。例如

 public List<EntityA> GetAEntitiesBy(int customerID) {
            var result = new List<EntityA>();
            int lastResultCount = 50;
            int callsMade = 0;

            while (lastResultCount == 50)
            {
            var results = MyApiWrapper.CreateODataContext().EntityA.Expand("Customer").Expand("EntityB").AsParallel()
        .Where(c => c.EntityA.CustomerID == customerID)
        .Where(c => c.EntityB.IsProperty1True && c.EntityB.Property2TypeID == 1)
        .Select(c => c)
        .Skip(callsMade * 50)
        .Take(50));

results.ForAll(c => nodes.Add(c));

            callsMade++;
            lastResultCount = results.Count;

            }

        return nodes;
}

我知道每次执行 DataServiceQuery 时我最多只能提取 50 行,我的瓶颈是在此函数结果返回到我的网络表单后创建的,因为后来我做了一个.ForEach并且对于我得到的每一行我需要运行一些其他的查询其他服务 (WCF)

任何建议如何加快此操作?

另一方面,当我调试此方法时,我发现在并行查询执行期间调用 GetEnumerator 时出现错误消息“无法评估子项”。

谢谢

4

1 回答 1

1

您当然可以通过并行发出多个查询来获得更好的整体吞吐量。您的客户必须为响应无序到达的可能性做好准备。Web 服务提供商可能会限制您允许进行的并行查询的数量。确保您理解并尊重这些限制。如果 Web 服务已经是次优的,根据其基础设施的大小,如果您同时发出太多请求,您可能会达到收益递减点。

另外的选择...

看起来您正在获取很多与客户相关的实体。您可能会考虑在第一次呈现网页时显示前 50 个,然后使用 Ajax 查询分批获取其余部分,例如 50 个。总吞吐量会比你先在服务器端获取它们,然后渲染页面要慢一些。但是,用户体验可能要好得多(具体取决于页面上发生的情况)。

于 2013-02-14T17:14:50.467 回答