为了账号安全,请及时绑定邮箱和手机立即绑定

DocumentDB 显示特定实体类型的所有文档

DocumentDB 显示特定实体类型的所有文档

C#
倚天杖 2021-09-19 16:27:34
我有一个通用IDocumentDbRepository存储库,用于为 DocumentDB 提供基本的 CRUD 操作,并为具有特定实体的附加操作提供特定存储库,这些实体继承或实现了此接口和类。    public interface IDocumentDbRepository<T> where T : class{    //IEnumerable<T> GetItems();    Task<IEnumerable<T>> GetItemsAsync();    Task<T> GetItemAsync(T id);    Task<T> AddDocumentAsync(T item);    Task<T> UpdateDocumentAsync(T id, T item);    Task DeletedocumentAsync(T id);}public class DocumentDbRepository<T> : IDocumentDbRepository<T> where T : class{    private readonly string AuthKey;    private readonly string EndpointUri;    private readonly string DatabaseId;    private readonly string CollectionId;    private static DocumentClient client;    public DocumentDbRepository(IOptions<DocumentDbSettings> DocumentDbConfig)    {        this.DatabaseId = DocumentDbConfig.Value.DatabaseName;        this.CollectionId = DocumentDbConfig.Value.CollectionName;        this.AuthKey = DocumentDbConfig.Value.AuthKey;        this.EndpointUri = DocumentDbConfig.Value.EndpointUri;        client = new DocumentClient(new Uri(EndpointUri), AuthKey);    }public async Task<IEnumerable<T>> GetItemsAsync(){     IDocumentQuery<T> query = client.CreateDocumentQuery<T>(     UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId))     .AsDocumentQuery();    List<T> results = new List<T>();    while (query.HasMoreResults)    {        results.AddRange(await query.ExecuteNextAsync<T>());    }    return results;}   // public IEnumerable<T> GetItems()   // {   //     var results = client.CreateDocumentQuery<T>//(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId)).ToList();   //   return results;   // }//methods在我的特定Employee存储库中,我的目标是仅返回类型的文档Employeepublic interface IEmployeeRepository : IDocumentDbRepository<Employee>{    List<Employee> GetAllEmployees();}
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

好的,有几件事。

首先,你应该永远不会调用.ToList();CreateDocumentQuery那样。它将通过线路进行多个同步调用,以返回数据库中的每个文档。这将导致疯狂的 RU/s 和非常糟糕的性能。

使用AsDocumentQuery和调用ExecuteNextAsyncwhile query.HasMoreResults

其次,当您调用该ToList()方法时,所有内容都作为 Employee 返回,因为您以这种方式查询它。您基本上是说,“将这个集合中的所有内容作为 Employee 归还给我,然后从那个归还我的 Employees”。在这个阶段,他们都是员工。

您真正需要的是type文档上的某种属性,您可以在ToList调用之前使用这些属性进行查询。

我建议您检查Cosmoaut 中的收藏共享是如何工作的。听起来完全像你需要的东西。

下面介绍了如何在不阻塞线程的情况下异步调用 ToList 方法。

免责声明:我是宇航员的创造者。


查看完整回答
反对 回复 2021-09-19
  • 1 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信