以下异常是什么意思?
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 回答
我不知道这是否特别是你的问题,但它肯定是我的,我花了一段时间才弄明白 . 由于我不太清楚的原因,Azure团队提供了两种不同且不兼容的方法来执行查询 - 虽然它们在运行时不兼容,但Azure团队帮助(不!)确保它们具有兼容的签名在编译时 .
查看此处描述的“Fluent”和“IQueryable”模式之间的区别:
http://blogs.msdn.com/b/windowsazurestorage/archive/2013/09/07/announcing-storage-client-library-2-1-rtm.aspx
换句话说,这两个都将编译和运行并且或多或少地做同样的事情:
但是虽然这个编译得很好,但它会在运行时与你(和我)碰到的
System.NotSupportedException
一起爆炸 .我确信MS的人们有充分的理由对这种特殊的违反行为 - 他们不是白痴 - 但我们说,这种行为当然是不寻常的 .
在“.Take(x)”之前添加“.AsQueryable()”将使其运行