代码之家  ›  专栏  ›  技术社区  ›  Roxy'Pro

如何在内存中查询列表而不是数据库调用

  •  0
  • Roxy'Pro  · 技术社区  · 5 年前

    我有一张 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));
     }
    

    以及另一种从DB数据创建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 或者不是这样我可能会 有孩子 属性正确。:)

    附笔

    我试过这样的方法:

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

    谢谢你们

    0 回复  |  直到 5 年前
        1
  •  1
  •   Cetin Basoz    5 年前
    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)
        });