确定来自针对Azure的FirstOrDefault的WCF数据服务LINQ查询的请求URI而不执行它?

m1m5dgzv  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(190)

问题

我想跟踪将由针对Microsoft.WindowsAzure.StorageClient.TableServiceContext对象执行的LINQ查询生成的URI。TableServiceContext只是用几个属性扩展了System.Data.Services.Client.DataServiceContext
我遇到的问题是,当我们在调试模式下在开发计算机上运行Web角色时(我们连接到云中的Azure存储,而不是使用开发存储),查询对Azure表存储示例执行良好。我可以使用Fiddler或仅将鼠标悬停在调试器中的语句上来获取结果查询URI。
但是,当我们将Web角色部署到Azure时,针对完全相同的Azure表存储源的查询失败,并出现ResourceNotFound DataServiceClientException。在处理FirstOrDefault()在空表上的行为之前,我们曾遇到过ResoureNotFound错误。这不是这里的问题。
作为解决该问题的一种方法,我希望比较在部署Web角色时生成的查询URI与在开发机器上运行Web角色时生成的查询URI。

问题

有人知道如何获取将在调用FirstOrDefault()方法时发送的查询的查询URI吗?我知道您可以在从TableServiceContext返回的IQueryable上调用ToString(),但我担心的是,当调用FirstOrDefault()时,Uri可能会进一步优化,并且IQueryable上的ToString()可能不是最终发送到服务器时调用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
        ...
    }
}

编辑更新和答案

Steve提供了书面答案。我们的问题与此post中的描述完全相同,该post描述了PartitionKey/RowKey ordering in Single Entity query的一个问题,该问题已通过Azure OS的更新得到修复。这解释了我们的开发计算机与Web角色部署到Azure的时间之间的差异。
当我指出我们以前在存在性检查中处理过ResourceNotFound问题时,我们在代码中用两种方法处理了它。一种方法是使用异常处理来处理ResourceNotFound错误,另一种方法是在LINQ查询中将RowKey放在第一位(正如一些MS人员所指出的那样)。
我们发现有几个地方RowKey是第一个,而不是使用异常处理。我们将通过重构代码以面向.NET 4并使用.IgnoreResourceNotFoundException = true property of the TableServiceContext来解决这个问题。
经验教训(不止一次):不要依赖于古怪的无证行为。

靠边##

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

从开发结构查询URI

过滤器=(行密钥等式'test19@gmail.com')和(分区密钥等式'41 e0 c1 ae-e74 d-458 e-8a 93-d2972 d9 ea 53 c')

从Azure结构查询URI

“一些东西”(行键=“测试19@gmail.com”,分区键=“41 e0 c1 ae-e74 d-458 e-8a 93-d2972 d9 ea 53 c”)

bq8i3lrv

bq8i3lrv1#

我可以做得更好...我想我知道问题出在哪里了
参见Link
具体地说,在以前的访客操作系统构建中,如果您按照自己的方式编写查询(RowKey predicate 在PartitionKey predicate 之前),则会生成筛选查询(反之,PartitionKey在RowKey之前),如果结果集为空,则会生成引发异常的查询。
我认为正确的解决方法(如上面的博客文章所示)是在您的上下文中将IgnoreResourceNotFoundException设置为true。

相关问题