首页 > 解决方案 > 如何在内存中查询列表而不是数据库调用

问题描述

我从数据库中获取列表companies,每家公司可能是另一家公司的父母company,我想知道哪些公司有孩子。没有别的,只是HasChildren=truefalse

从数据库中获取公司:

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 对象的 map 方法:

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正确填充属性。:)

附言

我试过这样的事情:

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 个额外的数据库调用来检查真/假数据:)

多谢你们

标签: c#entity-frameworklinq.net-coreasp.net-core-2.1

解决方案


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)
    });

推荐阅读