Как создать IQueryable Cosmos DB, содержащий только выбранные свойства? - PullRequest
0 голосов
/ 22 января 2019

Мне нужен метод, который принимает массив имен свойств properties и возвращает запрос документа IQueryable query с объектами, содержащими только эти свойства.IQueryable должен быть повторно использован для дальнейшего объединения в стиле LINQ, например, с .Where(...).

Попытка 1

string sql = $"SELECT {string.Join(",", properties.Select(x => $"c['{x}']"))} FROM c";
IQueryable<MyType> query = DocumentClient.CreateDocumentQuery<MyType>(CollectionUri, sql);

Это не работает, потому что, когда я пытаюсьЧтобы связать .Where(x => x.ObjectType == "user") с query, генерируется следующее исключение (даже когда properties содержит все свойства, необходимые для построения MyType):

System.ArgumentException: 'Expression of type 'System.Linq.IQueryable`1[System.Object]' cannot be used for parameter of type 'System.Linq.IQueryable`1[MyType]' of method 'System.Linq.IQueryable`1[MyType] Where[MyType](System.Linq.IQueryable`1[MyType], System.Linq.Expressions.Expression`1[System.Func`2[MyType,System.Boolean]])''

Попытка 2

Я попытался использовать dynamic вместо:

string sql = $"SELECT {string.Join(",", properties.Select(x => $"c['{x}']"))} FROM c";
IQueryable<dynamic> query = DocumentClient.CreateDocumentQuery(CollectionUri, sql);

Это также не работает: когда я пытаюсь связать .Where(x => x["objectType"] == "user") с query, код не 'даже компилировать:

CS1963  An expression tree may not contain a dynamic operation

Что делать?

Я использую Microsoft.Azure.DocumentDB.Core (2.2.1) в .NET Standard 2.0.

...