多对多在 graphql-dotnet 中使用 dataLoader
Many to many with dataLoader in graphql-dotnet
dataLoader如何实现多对多?
假设我想获取有联系人的公司(一个联系人可以有多个公司)。
我有一个 companyLinks 作为 midde table(companyId/contactId)。
当一家公司只有 1 个联系人时,我有这个可以使用:
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 个公司怎么办?我怎样才能知道正确的 companyId?
感谢 sungram3r 的提示。
解决办法是从加入-table.
开始
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);
}
dataLoader如何实现多对多?
假设我想获取有联系人的公司(一个联系人可以有多个公司)。 我有一个 companyLinks 作为 midde table(companyId/contactId)。
当一家公司只有 1 个联系人时,我有这个可以使用:
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 个公司怎么办?我怎样才能知道正确的 companyId?
感谢 sungram3r 的提示。 解决办法是从加入-table.
开始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);
}