问题
我想跟踪将由针对Microsoft.WindowsAzure.StorageClient.TableServiceContext对象执行的 LINQ 查询生成的 Uri。TableServiceContext只是扩展System.Data.Services.Client.DataServiceContext了几个属性。
我遇到的问题是,当我们在开发机器上以调试模式运行 Web 角色时,查询对我们的 Azure 表存储实例执行得很好(我们正在连接到云中的 Azure 存储而不使用 Dev Storage)。我可以使用 Fiddler 或将鼠标悬停在调试器中的语句上来获取结果查询 Uri。
但是,当我们将 Web 角色部署到 Azure 时,针对完全相同的 Azure 表存储源的查询会失败,并出现ResourceNotFound DataServiceClientException。FirstOrDefault()在处理空表的行为之前,我们遇到过 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')