我从数据库中获得companies
的列表,每个公司可能是另一个company
的母公司,我想找出哪些公司有子公司。没什么,只有HasChildren
= true
或false
:
从数据库获取公司:
public async Task<IEnumerable<CompDTO>> Get(SearchObject request)
{
IQueryable<Company> companies;
// .. some code where I'm fetching my companies
return Map(companies);
}
地图方法:
private IEnumerable<CompDTO> Map(IEnumerable<Company> companies)
{
return companies.Select(c => Map(c));
}
还有另一个从数据库数据创建DTO对象的映射方法:
private CompDTO Map(Company company)
{
return new CompDTO()
{
Id = company.Id,
CompanyName = company.Title,
ParentCompanyId = company.ParentCompanyId,
HasChildren = // I need to check here if company.Id is parent to any another company
};
}
基本上,我想检查我的对象是否具有childrens
,因此我可以正确填充HasChildren
属性。 :)
P.S
我已经尝试过类似的事情:
private CompDTO Map(Company company)
{
return new CompDTO()
{
Id = company.Id,
CompanyName = company.Title,
ParentCompanyId = company.ParentCompanyId,
HasChildren = HasChildren(companyId).GetAwaiter().Result();
};
}
private async Task<bool> HasChildren(long id)
{
return await _context.Companies.AnyAsync(c => c.ParentCompanyId == id && c.ParentCompany.Active);
}
但是通过这种方法,我收到了一条错误消息,指出几个线程共享一个数据库连接反正我想避免数据库调用来检查公司是否有子代(是或否)。我猜有可能在内存中做到这一点吗?因为在像5000这样的许多行上,将有5000个额外的DB调用来检查是非数据:)
谢谢你们
IQueryable<Company> companies = ctx.Companies;
var result = companies.AsEnumerable()
.Select(c => new {
c, HasChildren = companies.Any(cc => cc.parentCompanyId == c.Id)
});
编辑:
var companies = ctx.Companies.AsEnumerable();
var result = companies.Select(c => new CompDTO()
{
Id = c.Id,
CompanyName = c.Title,
ParentCompanyId = c.ParentCompanyId,
HasChildren = companies.Any(cc => cc.ParentCompanyId == c.Id)
});