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

dou*_*lps 10 c# azure mscorlib

以下异常是什么意思?

System.NotSupportedException了未处理的消息:"System.NotSupportedException"类型的未处理的异常出现在mscorlib.dll其他信息:流利方法可能不经由CloudTable.CreateQuery创建的查询被调用()

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

结果堆栈跟踪:在System.Web.Http.ApiController.d__1.MoveNext()---内部异常堆栈跟踪的末尾在System.Threading.Tasks.Task.ThrowIfExceptional(布尔includeTaskCanceledExceptions)在System.Threading.Tasks.任务1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task1.get_Result()在TestFramework.ExecuteRequest(HttpRequestMessage请求)在d:\在TestFramework.Post在d(字符串URI,对象tniObject):\在TestFramework.PostCall(字符串URI,对象o)在d:\在TestFramework dM中的.MyMethod(字符串一,字符串二,MyStruct三)(删除隐私)

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

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);
Run Code Online (Sandbox Code Playgroud)

我可以使用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);
Run Code Online (Sandbox Code Playgroud)

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

 var query = new TableQuery<TenantTNEntity>().Where(queryString);
Run Code Online (Sandbox Code Playgroud)

我现在得到的例外是:

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

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

Ken*_*ith 21

我不知道这是否特别是你的问题,但它肯定是我的,我花了一段时间才弄明白.由于我不太清楚的原因,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();
Run Code Online (Sandbox Code Playgroud)

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

var fluentQuery2 = Table.CreateQuery<T>().Where(filter);
var fluentResult2 = fluentQuery2.Execute();
Run Code Online (Sandbox Code Playgroud)

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


Ill*_*dan 5

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