问题
我想跟踪将由针对
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')