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

时间:2018-07-04 10:32:11

标签: c# asp.net azure asp.net-core azure-cosmosdb

我有一个通用的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();
}

public class EmployeeRepository : DocumentDbRepository<Employee>, IEmployeeRepository
{
    public EmployeeRepository(IOptions<DocumentDbSettings> DocumentDbConfig) : base(DocumentDbConfig)
    {

    }

    public List<Employee> GetAllEmployees()
    {
        return GetItems().Where(x => x.GetType() == typeof(Employee)).ToList(); 
    }
}

我在控制器中调用GetAllEmployees方法以仅在视图中列出类型为Employee的文档,但是它不起作用,并且所有具有任何实体类型的文档都被列出。我在做什么错了?

public IActionResult Index()
{
    return View(_employeeRepository.GetAllEmployees());
}

1 个答案:

答案 0 :(得分:1)

好,几件事。

首先,您永远不要像这样在.ToList();上致电CreateDocumentQuery。它将通过网络进行多个同步调用,以返回数据库中的每个文档。这将导致疯狂的RU / s和非常糟糕的性能。

AsDocumentQuery期间使用ExecuteNextAsync并致电query.HasMoreResults

第二,当您调用ToList()方法时,所有内容都作为Employee返回,因为您是通过这种方式查询的。您基本上说过:“以雇员的身份将本集合中的所有内容归还给我,然后以雇员的身份归还给我”。在这个阶段,他们都是员工。

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

我建议您检查collection sharingCosmonaut中的工作方式。听起来完全像您需要的东西。

Here是在不阻塞线程的情况下异步调用ToList方法的方法。

免责声明:我是Cosmonaut的创建者。