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

C# 如何在内存中查询列表而不是数据库调用,c#,entity-framework,linq,.net-core,asp.net-core-2.1,C#,Entity Framework,Linq,.net Core,Asp.net Core 2.1,我从数据库中获得了公司的列表,每个公司都可能是另一家公司的母公司,我想知道哪些公司有孩子。没有别的,只有有子项=true或false: 从数据库中获取公司: public async Task<IEnumerable<CompDTO>> Get(SearchObject request) { IQueryable<Company> companies; // .. some code where I'm fetching my companies

我从数据库中获得了
公司的列表
,每个公司都可能是另一家
公司的母公司
,我想知道哪些公司有孩子。没有别的,只有
有子项
=
true
false

从数据库中获取公司:

public async Task<IEnumerable<CompDTO>> Get(SearchObject request)
{
  IQueryable<Company> companies;
  // .. some code where I'm fetching my companies
  return Map(companies);
}
基本上,我想检查我的对象是否有
childrens
,这样我就可以正确地填充
haschilds
属性了

附言

我试过这样的方法:

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);
}
私人公司地图(公司)
{
返回新的CompDTO()
{
Id=公司Id,
CompanyName=公司名称,
ParentCompanyId=company.ParentCompanyId,
HasChildren=HasChildren(companyId).GetAwaiter().Result();
};
}
私有异步任务HasChildren(长id)
{
return await\u context.companys.AnyAsync(c=>c.ParentCompanyId==id&&c.ParentCompany.Active);
}
但通过这种方法,我收到了一个错误,即多个线程共享一个数据库连接 无论如何,我希望避免数据库调用来检查公司是否有孩子(对或错)。 我想这是可能的,在这里做的记忆?因为在许多行(如5000行)上,将有5000个额外的DB调用来检查真/假数据:)


谢谢大家

您可以使用AsEnumerable()。@CetinBasoz但是如何在我的示例中应用它?添加作为答案,这里会很混乱。您可以执行自连接查询并立即返回结果,而不是通过
HasChildren
方法中的另一个数据库查询来检查子公司。您正在尝试将公司加入到子公司,您将多线程放在一个表中,而不是整个查询中?这样您就不能使用SQL Server的功能。您强制读取数以百万计的查询,在客户端上同步它,而不是只使用一个查询?避免地图等?因为
haschilds
属性在
公司中不存在,
它只存在于
CompDTO
:)@Roxy'Pro中,所以haschilds是一个生成的属性。你也可以自由地使用一个类,而不是像我那样使用匿名(它只是一个示例)。不管怎样,为你编辑。投票吧,伙计!我想出来了,但不知何故,与此几乎相同的解决方案导致了另一个问题,发布在这里:
IQueryable<Company> companies = ctx.Companies;
var result = companies.AsEnumerable()
             .Select(c => new {
                c, HasChildren = companies.Any(cc => cc.parentCompanyId == c.Id)
             });
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);
}
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)
    });