C# 如何从CosmosDB中的特定类型获取所有项目

C# 如何从CosmosDB中的特定类型获取所有项目,c#,.net,asp.net-web-api,asp.net-web-api2,azure-cosmosdb,C#,.net,Asp.net Web Api,Asp.net Web Api2,Azure Cosmosdb,我有以下DocumentDBRepository using Microsoft.Azure.Documents; using Microsoft.Azure.Documents.Client; using Microsoft.Azure.Documents.Linq; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Linq.E

我有以下DocumentDBRepository

using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using System.Web;

namespace TenantManagementWebApi.DataAccess
{
    public static class DocumentDBRepository<T> where T : class
    {
        private static readonly string DatabaseId = ConfigurationManager.AppSettings["database"];
        private static readonly string CollectionId = ConfigurationManager.AppSettings["collection"];
        private static DocumentClient client;

        public static async Task<T> GetItemAsync(string id)
        {
            try
            {
                Document document = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id));
                return (T)(dynamic)document;
            }
            catch (DocumentClientException e)
            {
                if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    return null;
                }
                else
                {
                    throw;
                }
            }
        }

        public static async Task<IEnumerable<T>> GetItemsAsync(Expression<Func<T, bool>> predicate)
        {
            IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
                UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
                new FeedOptions { MaxItemCount = -1 })
                .Where(predicate)
                .AsDocumentQuery();

            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                results.AddRange(await query.ExecuteNextAsync<T>());
            }

            return results;
        }

        public static async Task<Document> CreateItemAsync(T item)
        {
            return await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId), item);
        }

        public static async Task<Document> UpdateItemAsync(string id, T item)
        {
            return await client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), item);
        }

        public static async Task DeleteItemAsync(string id)
        {
            await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id));
        }

        public static void Initialize()
        {
            client = new DocumentClient(new Uri(ConfigurationManager.AppSettings["endpoint"]), ConfigurationManager.AppSettings["authKey"]);
            CreateDatabaseIfNotExistsAsync().Wait();
            CreateCollectionIfNotExistsAsync().Wait();
        }

        private static async Task CreateDatabaseIfNotExistsAsync()
        {
            try
            {
                await client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(DatabaseId));
            }
            catch (DocumentClientException e)
            {
                if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    await client.CreateDatabaseAsync(new Database { Id = DatabaseId });
                }
                else
                {
                    throw;
                }
            }
        }

        private static async Task CreateCollectionIfNotExistsAsync()
        {
            try
            {
                await client.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId));
            }
            catch (DocumentClientException e)
            {
                if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    await client.CreateDocumentCollectionAsync(
                        UriFactory.CreateDatabaseUri(DatabaseId),
                        new DocumentCollection { Id = CollectionId },
                        new RequestOptions { OfferThroughput = 1000 });
                }
                else
                {
                    throw;
                }
            }
        }
    }
}
试试这个

public async Task<List<Tenant>> GetTenants()
{
    return await DocumentDBRepository<Tenant>.GetItemsAsync().ToList();
}
public异步任务GetTenants()
{
返回wait-wait-DocumentDBRepository.GetItemsAsync().ToList();
}

这不只是返回集合中的所有内容,而是尝试将它们映射为租户吗?此外,您发布的内容也是无效的。结果需要用括号括起来(wait DocumentDBRepository.GetItemsAsync()).ToList()@NickChapsas当然,这将返回OP想要的一切。通常,您希望从控制器返回经过筛选/分页的集合。不是你资源中的所有东西。它可以是数千条记录。我想要类型为Tenant的数据库中的所有项。我知道这是一个小数据库,它永远不会增长到超过100条记录。安装包:无法安装包“Cosmonaut 1.4.7”。您正试图将此程序包安装到以“.NETFramework,Version=v4.6”为目标的项目中,但该程序包不包含任何与该框架兼容的程序集引用或内容文件。有关详细信息,请与包作者联系。您的项目目标是.net4.6,Cosmonaut 1.4.7包不支持该目标。请参阅支持哪些框架版本的软件包副本
There is no argument given that corresponds to the required formal parameter 'predicate' of 'DocumentDBRepository<IQueryable<Tenant>>.GetItemsAsync(Expression<Func<IQueryabl
 public class Tenant
    {
        public string TenantId { get; set; }
        public string TenantUrl { get; set; }
        public string CertificatePath { get; set; }
        public string CertificatePassword { get; set; }

        public override string ToString()
        {
            return JsonConvert.SerializeObject(this);
        }
    }
public async Task<List<Tenant>> GetTenants()
{
    return await DocumentDBRepository<Tenant>.GetItemsAsync().ToList();
}