Hi,
Firstly, This might seem like a long question. I don't think it is... The code is just an overview of what im currently 
doing. It doesn't feel right, so I am looking for constructive criticism and warnings for pitfalls and suggestions of what I can do.
I have a database with business objects.
I need to access properties of parent objects.
I need to maintain some sort of state through business objects.
If you look at the classes, I don't think that the access modifiers are right. I don't think its structured very well. Most of the relationships are modelled with public properties. SubAccount.Account.User.ID <-- all of those are public..
Is there a better way to model a relationship between classes than this so its not so "public"?
The other part of this question is about resources:
If I was to make a User.GetUserList() function that returns a List, and I had 9000 users, when I call the GetUsers 
method, it will make 9000 User objects and inside that it will make 9000 new AccountCollection objects. What can I do to make this project not so resource hungry?
Please find the code below and rip it to shreds.
public class User {
   public string ID {get;set;}
   public string FirstName {get; set;}
   public string LastName {get; set;}
   public string PhoneNo {get; set;}
  public AccountCollection accounts {get; set;}
  public User {
     accounts = new AccountCollection(this);
  }
  public static List<Users> GetUsers() {
     return Data.GetUsers();
  }
}
public AccountCollection : IEnumerable<Account> {
  private User user;
  public AccountCollection(User user) {
     this.user = user;
  }
  public IEnumerable<Account> GetEnumerator() {
     return Data.GetAccounts(user);
  }
}
public class Account {
   public User User {get; set;}  //This is public so that the subaccount can access its Account's User's ID
   public int ID;
   public string Name;
   public Account(User user) {
      this.user = user;
   }
}
public SubAccountCollection : IEnumerable<SubAccount> {
  public Account account {get; set;}
  public SubAccountCollection(Account account) {
     this.account = account;
  }
  public IEnumerable<SubAccount> GetEnumerator() {
     return Data.GetSubAccounts(account);
  }
}
public class SubAccount {
   public Account account {get; set;}    //this is public so that my Data class can access the account, to get the account's user's ID.
   public SubAccount(Account account) {
      this.account = account;  
   }
   public Report GenerateReport() {
       Data.GetReport(this);
   }
}
public static class Data {
  public static List<Account> GetSubAccounts(Account account) {
      using (var dc = new databaseDataContext()) {
          List<SubAccount> query = (from a in dc.Accounts
                                where a.UserID == account.User.ID  //this is getting the account's user's ID
                                select new SubAccount(account) {
                                    ID = a.ID,
                                    Name = a.Name,
                                }).ToList();
      }
  }
  public static List<Account> GetAccounts(User user) {
     using (var dc = new databaseDataContext()) {
         List<Account> query = (from a in dc.Accounts
                               where a.UserID == User.ID  //this is getting the user's ID
                               select new Account(user) {
                                   ID = a.ID,
                                   Name = a.Name,
                               }).ToList();
     }
  }
  public static Report GetReport(SubAccount subAccount) {
     Report report = new Report();
     //database access code here
     //need to get the user id of the subaccount's account for data querying.
     //i've got the subaccount, but how should i get the user id.
     //i would imagine something like this:
     int accountID = subAccount.Account.User.ID;
     //but this would require the subaccount's Account property to be public.
     //i do not want this to be accessible from my other project (UI).
     //reading up on internal seems to do the trick, but within my code it still feels
     //public. I could restrict the property to read, and only private set.
     return report;
  }
  public static List<User> GetUsers() {
     using (var dc = new databaseDataContext()) {
         var query = (from u in dc.Users
                     select new User {
                       ID = u.ID,
                       FirstName = u.FirstName,
                       LastName = u.LastName,
                       PhoneNo = u.PhoneNo
                     }).ToList();
         return query;
     }
  }
}