After upgrading to DNN 5.5.0 we had to implement IHydratable on all of our business objects.
This idea seemed like a good way to go at first, but after playing with IHydratable I'm not so sure any more.
There are two possibilities:
- I'm doing it wrong
 - IHydratable forces you to use 
select *construct an all your queries 
The business case:
My first sproc returns the BgId and BgShortDesc
My second sproc returns BgId and BgReportedUser
My IHydratable is implemented as show below:
public class Bug : IHydratable
    {
            public int BgId {get;set;}
            public string BgShortDesc {get;set;}
            public int BgReportedUser {get;set;}
            public DateTime BgReportedDate {get;set;}
            public Bug(){}
        public int KeyID
        {
            get { return BgId; }
            set { BgId = value; }
        }
        public void Fill(IDataReader dr)
        {
                BgId = Convert.ToInt32(Null.SetNull(dr["BgId"], BgId));
                BgShortDesc = Convert.ToString(Null.SetNull(dr["BgShortDesc"], BgShortDesc));
                BgReportedUser = Convert.ToInt32(Null.SetNull(dr["BgReportedUser"], BgReportedUser));
                BgReportedDate = Convert.ToDateTime(Null.SetNull(dr["BgReportedDate"], BgReportedDate));
        }
}
Fill method will throw IndexOutOfRangeException on any of the above sprocs, since not all the fields get returned with IDataReader.
The easy way around the problem is to use select * in all of the sprocs, but that's not a good practice.
What's the PROPER way of implementing IHydratable in this scenario?
p.s. keep in mind that my example is oversimplified to get the point across.