Объясните работу GC в конкретном случае

Есть вот такой код:

public async Task<IEnumerable<Subject>> TryReadAllAsync()
{
    try
    {
        using DataContext db = new DataContext(_connectionString);
        return await Task.Run(() => db.GetTable<Subject>().ToList()).ConfigureAwait(false);
    }
    catch
    {
        return null;
    }
}

И есть класс, который в конструкторе инициализирует коллекцию вот так:

public SomeClass
{
     SomeClass()
     {
         Subjects = Task.Run(async () => await DaoFactory.GetDaoSubject().TryReadAllAsync().ConfigureAwait(false)).Result;
     }
    
     public IEnumerable<Subject> Subjects { get; set; }
}

Далее к Subjects идет обращение много где(и нигде не вызывается Dispose() явным образом).

В чем, собственно, вопрос:

если здесь return await Task.Run(() => db.GetTable<Subject>().ToList()).ConfigureAwait(false); убрать .ToList(), то после некоторого кол-ва обращений к Subjects для него где-то вызовется Dispose() неявным образом, и я на это не смог повлиять, пока не нашел решение через добавление .ToList().

Объясните, пожалуйста, почему так?