问题
我想跟踪将由针对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 the
TableServiceContext 来解决这个问题。
经验教训(不止一次):不要依赖古怪的无证行为。
在旁边
我们能够得到查询 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')