Многие ко многим с dataLoader в graphql-dotnet - PullRequest
0 голосов
/ 27 марта 2020

Как мы можем добиться многого ко многим с помощью DataLoader?

Допустим, я хочу получить компании с их контактами (и у контакта может быть несколько компаний). У меня есть companyLinks как таблица midde (с companyId / contactId).

У меня есть это, которое работает, когда есть только один контакт для компании:

public async Task<ILookup<Guid, Contact>> GetContactsFromCompanyBatchAsync(IEnumerable<Guid> companyIds)    
{
  var contacts = _entities.Include(c => c.CompanyLinks).Where(contact => contact.CompanyLinks.Any(cl => companyIds.Contains(cl.CompanyId)));
  return contacts.ToLookup(cont => {
       var res = cont.CompanyLinks.Any() ? cont.CompanyLinks.ElementAt(0).CompanyId : Guid.Empty;
       return res;
  });
}

Но что, если контакт имеет больше чем 1 компания? Как я могу узнать правильный идентификатор компании?

1 Ответ

0 голосов
/ 06 апреля 2020

Спасибо sungram3r за подсказку. Решение состоит в том, чтобы начать с объединяющего стола.

public async Task<ILookup<Guid, Contact>> GetContactsFromCompanyBatchCollectionAsync(IEnumerable<Guid> companyIds)
    {
        var companyContacts = _salesNoteContext.CompanyContact
           .Where(contactCompany => companyIds.Contains(contactCompany.CompanyId))
           .Include(contactCompany => contactCompany.Company);
        return companyContacts.ToLookup(contactCompany => contactCompany.CompanyId, contactCompany => contactCompany.Contact);
    }
...