public void ReadAll(bool ReadRemoved = false) { allRecords = new List <T>(); OpenMainRead(); BaseClass trash = (BaseClass)Activator.CreateInstance(typeof(T)); int line = Convert.ToInt32(mainFile.Length) / trash.RowSize(); for (int id = 0; id < line; id++) { Tuple <BaseClass, Dictionary <PropertyInfo, int> > fillingLog; fillingLog = FileOps.ReadSingleRecord(mainFile, id + 1, typeof(T)); BaseClass rec = fillingLog.Item1; if (ReadRemoved || !rec.removed) { allRecords.Add((T)rec); foreach (KeyValuePair <PropertyInfo, int> kp in fillingLog.Item2) //OTOReq'ler { object dbset = ctx.GetDBSetByType(kp.Key.PropertyType); if (kp.Value == -1) //null, okumaya çalışma! { continue; } Tuple <object, PropertyInfo, int> RecordToBeFilled = new Tuple <object, PropertyInfo, int>(fillingLog.Item1, kp.Key, kp.Value); object[] parameters = { new OTOReq(fillingLog.Item1, kp.Key, kp.Value) }; dbset.GetType().GetMethod("AddOTOReq").Invoke(dbset, parameters); } foreach (PropertyInfo OTM in trash.OTM_One()) { if (OTM.GetValue(fillingLog.Item1) == null) { OTM.SetValue(OTM.GetValue(fillingLog.Item1), Activator.CreateInstance(OTM.PropertyType)); } object dbset = ctx.GetDBSetByType(OTM.PropertyType.GetGenericArguments()[0]); object[] parameters = { new Tuple <object, PropertyInfo>(fillingLog.Item1, OTM) }; dbset.GetType().GetMethod("AddOTMReq").Invoke(dbset, parameters); } //MTM ReadMTM(fillingLog.Item1); } } mainFile.Close(); }
/// <summary> /// Reads the middle table of many-to-many relationship. Bad performance currently, because it reads the /// middle file everytime a record is read. /// </summary> /// <param name="rec"></param> public void ReadMTM(BaseClass rec) { foreach (MTMRelationInfo mtmInfo in rec.MTMInfoList()) { String filepath = Path.Combine(ctx.DatabaseFolder, mtmInfo.tableName) + ".dat"; //mtm middle tablo yolu Stream mtmStream = File.OpenRead(filepath); int line = Convert.ToInt32(mtmStream.Length / (sizeof(int) * 3)); List <MTMRec> mtmRecs = new List <MTMRec>(); //middle tablo kayıtları for (int i = 0; i < line; i++) { Tuple <DKDB.BaseClass, Dictionary <PropertyInfo, int> > fillingLog; fillingLog = FileOps.ReadSingleRecord(mtmStream, i + 1, typeof(MTMRec)); mtmRecs.Add((MTMRec)fillingLog.Item1); } mtmStream.Close(); int my_id_column = WhoAmI(mtmInfo.tableName); //MTMRec içinde id1 mi benim sütunum yoksa id2 mi? ctx'teki sıraya göre kontrol edilir MTMReq mtmReq = new MTMReq(rec, mtmInfo.OwnMTMProp); foreach (MTMRec mtmRec in mtmRecs) //her bir middle tablo kaydı için: { if (my_id_column == 1 && mtmRec.id_1 == rec.id) { mtmReq.AddOppId(mtmRec.id_2);//opposite id } else if (my_id_column == 2 && mtmRec.id_2 == rec.id) { mtmReq.AddOppId(mtmRec.id_1);//opposite id } } KeyValuePair <string, Tuple <Type, Type> > kp = BaseClass.AllMTMRelations.FirstOrDefault(r => r.Key == mtmInfo.tableName); object opposite_dbset = ctx.GetDBSetByType(my_id_column == 1 ? kp.Value.Item2 : kp.Value.Item1); object[] parameters = new object[1]; parameters[0] = mtmReq; //list of ids of the records that we want to read from opposite db PropertyInfo fi = opposite_dbset.GetType().GetProperty("MTMReqList"); List <MTMReq> rtbfMTM = fi.GetValue(opposite_dbset) as List <MTMReq>; rtbfMTM.GetType().GetMethod("Add").Invoke(rtbfMTM, parameters); } }