2013-02-27 1 views
1

При использовании TableServiceContext для запроса Azure Table Storage Я бы выполнить запрос следующим образом:Изменения в AsTableServiceQuery() в Client Library Storage 2,0

var entities = context.CreateQuery<TEntity>(TableName) 
         .AsTableServiceQuery() 
         .Where(condition); 

Но это не компилируется в новом клиенте Storage Library 2.0 :

Отсутствие перегрузки для метода «AsTableServiceQuery» принимает 0 аргументов.

Единственным доступным методом является AsTableServiceQuery(TableServiceContext context);

Это означает, что я должен был бы иметь следующее:

var entities = context.CreateQuery<TEntity>(TableName) 
         .AsTableServiceQuery(context) 
         .Where(condition); 

Я поставляет контекст дважды. Зачем?

ответ

2

Способ работы IQueryProvider заключается в том, что каждое расширение Linq фактически модифицирует дерево выражений и передает его самому поставщику через CreateQuery.

(см http://msdn.microsoft.com/en-us/library/system.linq.iqueryprovider.aspx)

Поскольку реализация вы имеете в виду это WCF Data Services обнаженный поставщик создает DataServiceQuery, а не TableServiceQuery, по сути зачистки его специфической оболочки Azure. К сожалению, DataServiceQuery не раскрывает связанный с ним контекст, который требуется для некоторых функций и определенных проверок надежности. Поэтому окончательное решение требует, чтобы этот последний метод снова принял контекст, чтобы гарантировать, что запрос правильно завернут и связан с контекстом, из которого он был создан.

Обратите внимание, что DataServiceQuery не поддерживает продолжения, поэтому при запросе на Azure Tables вы всегда должны использовать расширение AsTableServiceQuery (ctx), чтобы гарантировать, что это завершение выполняется.

Я также хотел бы предложить вам ознакомиться с новым уровнем обслуживания таблиц, представленным в пространстве имен .Table, поскольку он обеспечивает дополнительную гибкость, резкое увеличение производительности и позволяет избежать этих сложностей. Обратите внимание, что TSL в настоящее время не раскрывает IQueryProvider.

Надеется, что это помогает,

Джо

+0

Великого ответ! Я бы использовал новый уровень обслуживания таблицы, но он не использует IQueryProvider. [Я задал вопрос об этом здесь.] (Http://stackoverflow.com/questions/15097902/storage-client-library-2-0-why-is-the-api-not-as-intuitive-to-use -по 1-7) – davenewza