猿问

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

我有一个通用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存储库中,我的目标是仅返回类型的文档Employee


public interface IEmployeeRepository : IDocumentDbRepository<Employee>

{

    List<Employee> GetAllEmployees();

}


倚天杖
浏览 193回答 1
1回答

www说

好的,有几件事。首先,你应该永远不会调用.ToList();上CreateDocumentQuery那样。它将通过线路进行多个同步调用,以返回数据库中的每个文档。这将导致疯狂的 RU/s 和非常糟糕的性能。使用AsDocumentQuery和调用ExecuteNextAsyncwhile&nbsp;query.HasMoreResults。其次,当您调用该ToList()方法时,所有内容都作为 Employee 返回,因为您以这种方式查询它。您基本上是说,“将这个集合中的所有内容作为 Employee 归还给我,然后从那个归还我的 Employees”。在这个阶段,他们都是员工。您真正需要的是type文档上的某种属性,您可以在ToList调用之前使用这些属性进行查询。我建议您检查Cosmoaut 中的收藏共享是如何工作的。听起来完全像你需要的东西。下面介绍了如何在不阻塞线程的情况下异步调用 ToList 方法。免责声明:我是宇航员的创造者。
随时随地看视频慕课网APP
我要回答