C# 如何从CosmosDB中的特定类型获取所有项目
我有以下DocumentDBRepositoryC# 如何从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
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();
}