DocumentDB показать все документы определенного типа объекта - PullRequest
0 голосов
/ 04 июля 2018

У меня есть общий репозиторий IDocumentDbRepository для обеспечения базовых операций CRUD с DocumentDB и конкретных репозиториев для дополнительных операций с конкретными сущностями, который наследует или реализует этот интерфейс и класс.

    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 голосов
/ 04 июля 2018

Хорошо, несколько вещей.

Во-первых, вы никогда не должны так звонить .ToList(); на CreateDocumentQuery. Он сделает несколько синхронных вызовов по проводам, чтобы вернуть каждый отдельный документ в базе данных. Это приведет к безумным RU / s и очень плохой производительности.

Используйте AsDocumentQuery и звоните ExecuteNextAsync, а query.HasMoreResults.

Во-вторых, ко времени, когда вы вызываете метод ToList(), все возвращается как Сотрудник, потому что вы запрашивали его таким образом. Вы в основном сказали: «Верните мне все в этой коллекции как Сотрудника, а затем верните мне Сотрудников». На этом этапе все они являются сотрудниками.

Что вам действительно нужно, так это какое-то свойство type в вашем документе, которое вы можете использовать для запроса перед выполнением вызова ToList.

Я бы порекомендовал вам проверить, как обмен коллекциями работает в Cosmonaut . Звучит как то, что вам нужно.

Здесь - это способ асинхронного вызова метода ToList без блокировки потока.

Отказ от ответственности: я создатель Космонавта.

...