代码之家  ›  专栏  ›  技术社区  ›  Matt Spradley

在不执行的情况下,从WCF数据服务Linq查询中确定对Azure的FirstOrDefault的请求URI?

  •  1
  • Matt Spradley  · 技术社区  · 14 年前

    问题

    我想跟踪将由针对 Microsoft.WindowsAzure.StorageClient.TableServiceContext 对象。 TableServiceContext 只是延伸 System.Data.Services.Client.DataServiceContext 有一些属性。

    我面临的问题是,当我们以调试模式在dev计算机上运行web角色时(我们在云中连接到Azure存储,而不是使用dev存储),查询对我们的Azure表存储实例执行良好。我可以使用fiddler或将鼠标悬停在调试器中的语句上获取得到的查询URI。

    但是,当我们将Web角色部署到Azure时,查询会针对与 资源未找到DataServiceClientException . 我们已经解决了在处理 FirstOrDefault() 在空表上。这不是问题所在。

    作为解决问题的一种方法,我想比较部署Web角色时生成的查询URI与在开发人员计算机上运行时生成的查询URI。

    问题

    是否有人知道获取将在 第一个或默认值() 方法被调用。我知道你可以打电话 ToString() IQueryable 从返回 表服务上下文 但我担心的是 第一个或默认值() 称为URI,可以进一步优化和 托斯特林() 可查询的 可能不是最终发送到服务器的 第一个或默认值() 被称为。

    如果有人对这个问题有另一种解决方法,我愿意接受建议。当试图确定表达式树最终被评估时将发生什么时,这似乎是LINQ的一个普遍问题。我也愿意接受这里的建议,因为我的LINQ技能需要一些改进。

    样例代码

    public void AddSomething(string ProjectID, string Username) {
        TableServiceContext context = new TableServiceContext();
    
        var qry = context.Somethings.Where(m => m.RowKey == Username
            && m.PartitionKey == ProjectID);
    
        System.Diagnostics.Trace.TraceInformation(qry.ToString());
        // ^ Here I would like to trace the Uri that will be generated
        // and sent to the server when the qry.FirstOrDefault() call below is executed.
    
        if (qry.FirstOrDefault() == null) {
            // ^ This statement generates an error when the web role is running
            // in the fabric
            ...
        }
    }
    

    编辑更新并回答

    史蒂夫提供了书面答复。我们的问题在这篇文章中有详细的描述 post 它描述了一个问题 PartitionKey/RowKey ordering in Single Entity query 这是通过对Azure OS的更新来修复的。这解释了我们的开发人员机器和何时将Web角色部署到Azure之间的差异。

    当我指出我们已经处理了 资源未找到 在我们的存在检查之前,我们在代码中以两种方式处理了这个问题。一种方法是使用异常处理来处理 资源未找到 错误,另一种方法是 罗基 首先是在Linq查询中(正如一些MS人员所指出的那样,这是适当的)。

    事实证明我们有几个地方 罗基 是第一个,而不是使用异常处理。我们将通过将代码重构为目标.NET 4并使用 .IgnoreResourceNotFoundException = true property of the TableServiceContext。

    经验教训(不止一次):不要依赖于古怪的无证行为。

    旁白

    我们能够得到查询的URI。它们确实是不同的(正如在博客文章中指出的那样)。结果如下:

    从dev结构查询uri

    ` https://ourproject.table.core.windows.net/Somethings() ?$filter=(rowkey eq'test19@gmail.com')和(partitionkey eq'41e0c1ae-e74d-458e-8a93-d2972d9ea53c')

    从Azure结构查询URI

    ` https://ourproject.table.core.windows.net/Somethings(RowKey= 'test19@gmail.com',partitionkey='41e0c1ae-e74d-458e-8a93-d2972d9ea53c')

    1 回复  |  直到 14 年前
        1
  •  2
  •   user94559    14 年前

    我可以做得更好…我想我知道问题所在。:)

    http://blogs.msdn.com/b/windowsazurestorage/archive/2010/07/26/how-wcf-data-service-changes-in-os-1-4-affects-windows-azure-table-clients.aspx .

    具体来说,以前(在以前的来宾操作系统构建中)的情况是,如果您像以前那样编写查询(在partitionkey谓词之前使用rowkey谓词),它会导致一个筛选查询(而在相反的情况下,partitionkey在rowkey之前),从而导致在结果集为空时引发异常的查询类型。

    我认为正确的解决方法(如上面的博客文章所示)是在您的上下文中将IgnoreResourceNotFoundException设置为true。