返回DbSet \ IQueryable时如何使用EF Core的Context避免泄漏?

时间:2017-08-01 18:04:53

标签: c# entity-framework-core

我在EntityManager之上EntityRepository的{​​{1}}架构EntityContext。 例如:

上下文:

public class ContactsContext : DbContext
{
    ...
    public DbSet<CompanyEntity> Companies { get; set; }
}

回购:

public class ContactsRepository
{
    private readonly ContactsContextFactory m_contactsContextFactory;
    ...
    public IEnumerable<CompanyEntity> GetCompanies()
    {
            using (ContactsContext context = m_contactsContextFactory.Create())
            {
                    return context.Companies.ToList();
            }
    }
}

管理器:

public class ContactsManager
{
    private readonly ContactsRepository m_contactsRepository;
    ...
    public IEnumerable<CompanyEntity> GetCompanies(Predicate<CompanyEntity> p_predicate)
    {
            return m_contactsRepository.GetCompanies().Where(c => p_predicate(c));
    }
}

我希望获得更高的性能,因此我想让Repo从Context中返回IQueryable或者DbSet,以便管理器可以过滤列表直接使用SQL而不是首先获取所有内容然后过滤。

  1. 这看起来像是一个合适的解决方案吗?能否请您 详细说明DbSet vs IQueryable
  2. 我看到了,如果我 返回DbSetIQueryable,然后返回上下文的资源 因为我们还要去,所以无法释放(using结束后) 查询数据库(在经理中) - 我是否正确?如果是的话,我该怎么办? 克服这个问题? - 实际上,它抛出了一个异常,即已经释放了上下文。
  3. 还有其他建议吗?我很乐意 听。谢谢!

0 个答案:

没有答案