using System; using System.Collections.Generic; using System.Data; // // assume que a tabela tinha coluna ID // se quiserem podem usar a coluna NIF como campo chave da tabela; teriam que alterar algum código no Identity Map // public abstract class ActiveRecord { int _id; public int ID { get { return _id; } } // ... métodos auxiliares de acesso a dados public abstract int Save(); protected IDictionary loaded = new Dictionary(); } public class Address { string addr1; string addr2; string local; string postal; public Address(string addr1, string addr2, string local, string postal) { this.addr1 = addr1; this.addr2 = addr2; this.local = local; this.postal = postal; } } public class Entity : ActiveRecord { protected abstract object CreateObject(DataRow r); protected Entity(DataRow r) { name = (string)r["Nome"]; nif = (string)r["NIF"]; email = (string)r["Email"]; addr = new Address(r["Rua"], r["rua2linha"], r["localidadelocal"], r["codpostal"]); telefone = (string)r["telefone"]; } string name; string nif; Address addr; string email; string telefone; public static IList GetByName(string namePattern) { IList ret = new List(); DataSet ds = ExecuteQuery("SELECT * FROM Contactos WHERE Nome LIKE ?", new object[] { namePattern+"%" } ); foreach (DataRow r in ds.Tables[0].Rows) { Entity e; if (loaded.ContainsKey((int)r["ID"])) e = loaded[(int)r["ID"]]; else { if ((byte)r["tipo"] == 0) e = new Person(r); else e = new Organization(r); loaded.Add((int)r["ID"], e); } ret.Add(e); } return ret; } } public class Person : Entity { protected Person(DataRow r) : base(r) { dateOfBirth = (DateTime)r["DataNascimento"]; } DateTime dateOfBirth; public int Age { get { TimeSpan ts = DateTime.Now - dateOfBirth; return ts.Days/365; } } } public class Organization : Entity { protected Organization(DataRow r) : base(r) { } }