首页 文章

“可能无法在通过CloudTable.CreateQuery <T>()”异常创建的查询上调用Fluent方法

提问于
浏览
10

以下异常是什么意思?

System.NotSupportedException未处理消息:mscorlib.dll中发生未处理的“System.NotSupportedException”类型的异常附加信息:可能无法在通过CloudTable.CreateQuery()创建的查询上调用Fluent方法

它没有显示抛出异常的代码,因此我不知道如何开始调试它 .

结果StackTrace:在System.Web.Http.ApiController.d__1.MoveNext()---内部异常堆栈跟踪的结束---在System.Threading.Tasks的System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)处.Task1.GetResultCore(Boolean waitCompletionNotification)在System.Threading.Tasks.Task1.get_Result()中的TestFramework.ExecuteRequest(HttpRequestMessage请求)中的d:\ at TestFramework.Post(String uri,Object tniObject)在d:\中的TestFramework . PostCall(String uri,Object o)在d:\中的TestFramework.MyMethod(字符串一,字符串二,MyStruct三)中的d:\ ...(为隐私而删除)

我相信问题出在以下说明中 .

string queryString = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, myId),
                                               TableOperators.And,
                                               TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, number));
var theQuery = MyTable.CreateQuery<MyEntity>().Where(queryString);

我可以使用 theQuery 然后执行分段异步查询吗?

var returnList = new List<T>();
TableQuerySegment<T> querySegment = null;

querySegment = await theQuery.AsTableQuery().ExecuteSegmentedAsync(null);

// The query could potentially return more than one object
returnList.AddRange(querySegment);

好吧,将 CreateQuery 方法调用更改为以下代码使得异常消失 .

var query = new TableQuery<TenantTNEntity>().Where(queryString);

我现在得到的例外是:

结果消息:测试方法MyMethod抛出异常:

System.AggregateException:发生一个或多个错误 . ---> System.InvalidOperationException:未知表 . TableQuery没有关联的CloudTable参考 . 请通过CloudTable ExecuteQuery API执行查询 .

2 回答

  • 20

    我不知道这是否特别是你的问题,但它肯定是我的,我花了一段时间才弄明白 . 由于我不太清楚的原因,Azure团队提供了两种不同且不兼容的方法来执行查询 - 虽然它们在运行时不兼容,但Azure团队帮助(不!)确保它们具有兼容的签名在编译时 .

    查看此处描述的“Fluent”和“IQueryable”模式之间的区别:

    http://blogs.msdn.com/b/windowsazurestorage/archive/2013/09/07/announcing-storage-client-library-2-1-rtm.aspx

    换句话说,这两个都将编译和运行并且或多或少地做同样的事情:

    var fluentQuery = new TableQuery<T>().Where(filter);
    var fluentResult = Table.ExecuteQuery(fluentQuery);
    
    var iQueryableQuery= from ent in Table.CreateQuery<T>() 
                         where ent.PartitionKey == "some value" 
                         select ent;
    var iQueryableResult = iQueryableQuery.AsTableQuery().Execute();
    

    但是虽然这个编译得很好,但它会在运行时与你(和我)碰到的 System.NotSupportedException 一起爆炸 .

    var fluentQuery2 = Table.CreateQuery<T>().Where(filter);
    var fluentResult2 = fluentQuery2.Execute();
    

    我确信MS的人们有充分的理由对这种特殊的违反行为 - 他们不是白痴 - 但我们说,这种行为当然是不寻常的 .

  • 4

    在“.Take(x)”之前添加“.AsQueryable()”将使其运行

相关问题