1

问题

我想跟踪将由针对Microsoft.WindowsAzure.StorageClient.TableServiceContext对象执行的 LINQ 查询生成的 Uri。TableServiceContext只是扩展System.Data.Services.Client.DataServiceContext了几个属性。

我遇到的问题是,当我们在开发机器上以调试模式运行 Web 角色时,查询对我们的 Azure 表存储实例执行得很好(我们正在连接到云中的 Azure 存储而不使用 Dev Storage)。我可以使用 Fiddler 或将鼠标悬停在调试器中的语句上来获取结果查询 Uri。

但是,当我们将 Web 角色部署到 Azure 时,针对完全相同的 Azure 表存储源的查询会失败,并出现ResourceNotFound DataServiceClientExceptionFirstOrDefault()在处理空表的行为之前,我们遇到过 ResoureNotFound 错误。这不是这里的问题。

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

问题

有谁知道获取查询 Uri 的方法,该查询将在FirstOrDefault()调用该方法时发送。我知道您可以调用ToString()IQueryable返回的内容,TableServiceContext但我担心的是,何时FirstOrDefault()调用 Uri 可能会进一步优化,并且ToString()onIQueryable可能不是最终在FirstOrDefault()调用时发送到服务器的内容。

如果有人对这个问题有另一种方法,我愿意接受建议。当试图确定最终评估表达式树时会发生什么时,这似乎是 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
        ...
    }
}

编辑更新和回答

史蒂夫提供了写答案。我们的问题与这篇文章中的描述完全相同,该文章描述了单实体查询中的 PartitionKey/RowKey 排序问题,该问题已通过更新 Azure OS 得到修复。这解释了我们的开发机器与将 Web 角色部署到 Azure 的时间之间的差异。

当我指出我们之前在存在检查中处理过ResourceNotFound问题时,我们在代码中以两种方式处理了它。一种方法是使用异常处理来处理ResourceNotFound错误,另一种方法是将RowKey首先放在 LINQ 查询中(正如一些 MS 人员指出的那样)。

事实证明,我们有几个地方首先使用RowKey而不是使用异常处理。我们将通过将代码重构为面向 .NET 4 并使用.IgnoreResourceNotFoundException = true property of theTableServiceContext 来解决这个问题。

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

在旁边

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

从 Dev Fabric 查询 Uri

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

从 Azure Fabric 查询 Uri

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

4

1 回答 1

2

我可以做得更好...我想我知道问题出在哪里。:)

请参阅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

具体来说,过去的情况是(在以前的 Guest OS 版本中),如果您像以前那样编写查询(在 PartitionKey 谓词之前使用 RowKey 谓词),则会导致过滤查询(而相反,PartitionKey 在 RowKey 之前)如果结果集为空,则会导致引发异常的那种查询。

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

于 2010-07-27T04:33:06.897 回答