/// <summary> /// Populate the sub entities of thingList /// </summary> /// <param name="things"></param> /// <param name="toPopulate"></param> public override void Populate(IEnumerable <Thing> things, Flags toPopulate) { Log("Populate", things.GetIdenties(), toPopulate); // Implement breadth first loading of related entities. // Any entity that has been requested to be loaded, should be loaded at this level where possible. // Remove all sub entity types that this entity relates to directly. Flags stillToPopulate = toPopulate; stillToPopulate = stillToPopulate.Remove(EntityType.Widget); // Get sub entities: Widget if ((toPopulate & EntityType.Widget) == EntityType.Widget) { // Grab the ones that actually need populating IEnumerable <Thing> toBePopulated = things.Where(entity => entity.WidgetListPopulated == false); // And load the sub entities for those ones. WidgetList childWidgetList = toBePopulated.Count() > 0 ? WidgetRepo.GetByThingId( toBePopulated.GetIdenties(), stillToPopulate) : new WidgetList(); Dictionary <int, List <Widget> > widgetListByThingId = childWidgetList.MapByThingId; // Now go over all the entites. For ones that need popualting, populate collection // directly. For those already populated, make a check on sub entities to ensure // they are loaded to the required level WidgetList toBeChecked = new WidgetList(); foreach (Thing thing in things) { if (!thing.WidgetListPopulated) { var WidgetListsForThing = widgetListByThingId.ContainsKey(thing.Identity) ? widgetListByThingId[thing.Identity] : null; if (WidgetListsForThing != null) { WidgetListsForThing.ForEach(entity => entity.Thing = thing); } thing.PopulateWidgetList(WidgetListsForThing); } else { toBeChecked.AddRange(thing.WidgetList); } } // If there's any "to be checked" (because they were already loaded) let the entities own // repo do whatever checks it needs to do if (toBeChecked.Count > 0) { WidgetRepo.Populate(toBeChecked, stillToPopulate); } } }
/// <summary> /// Populate the sub entities of fieldTestList /// </summary> /// <param name="fieldTests"></param> /// <param name="toPopulate"></param> public override void Populate(IEnumerable <FieldTest> fieldTests, Flags toPopulate) { Log("Populate", fieldTests.GetIdenties(), toPopulate); // Implement breadth first loading of related entities. // Any entity that has been requested to be loaded, should be loaded at this level where possible. // Remove all sub entity types that this entity relates to directly. Flags stillToPopulate = toPopulate; stillToPopulate = stillToPopulate.Remove(EntityType.Widget); stillToPopulate = stillToPopulate.Remove(EntityType.Widget); // Get parent entities: Widget if ((toPopulate & EntityType.Widget) == EntityType.Widget) { // Grab the ids for the ones that actually need populating IEnumerable <FieldTest> toBePopulated = fieldTests.Where(entity => entity.ForeignKeyFieldWidgetRequiresPopulation); int[] idsToLoad = toBePopulated.Select(entity => entity.ForeignKeyField).ToList().ToArray(); // And load the sub entities for those ones. WidgetList parentWidgetList = toBePopulated.Count() > 0 ? WidgetRepo.Get(idsToLoad, stillToPopulate) : new WidgetList(); Dictionary <int, Widget> widgetListById = parentWidgetList.MapById; // Now go over all the entites. For ones that need popualting, populate entities // directly. For those already populated, make a check on sub entities to ensure // they are loaded to the required level WidgetList toBeChecked = new WidgetList(); foreach (FieldTest fieldTest in fieldTests) { if (fieldTest.ForeignKeyFieldWidgetRequiresPopulation) { fieldTest.ForeignKeyFieldWidget = widgetListById.ContainsKey(fieldTest.ForeignKeyField) ? widgetListById[fieldTest.ForeignKeyField] : null; } else if (fieldTest.ForeignKeyFieldWidgetPopulated) { toBeChecked.Add(fieldTest.ForeignKeyFieldWidget); } } // If there's any "to be checked" (because they were already loaded) let the entiies own // repo do whatever checks it needs to do if (toBeChecked.Count > 0) { WidgetRepo.Populate(toBeChecked, stillToPopulate); } } // Get parent entities: Widget if ((toPopulate & EntityType.Widget) == EntityType.Widget) { // Grab the ids for the ones that actually need populating IEnumerable <FieldTest> toBePopulated = fieldTests.Where(entity => entity.ForeignKeyFieldNullableWidgetRequiresPopulation); int[] idsToLoad = toBePopulated.Select(entity => entity.ForeignKeyFieldNullable.Value).ToList().ToArray(); // And load the sub entities for those ones. WidgetList parentWidgetList = toBePopulated.Count() > 0 ? WidgetRepo.Get(idsToLoad, stillToPopulate) : new WidgetList(); Dictionary <int, Widget> widgetListById = parentWidgetList.MapById; // Now go over all the entites. For ones that need popualting, populate entities // directly. For those already populated, make a check on sub entities to ensure // they are loaded to the required level WidgetList toBeChecked = new WidgetList(); foreach (FieldTest fieldTest in fieldTests) { if (fieldTest.ForeignKeyFieldNullableWidgetRequiresPopulation) { fieldTest.ForeignKeyFieldNullableWidget = widgetListById.ContainsKey(fieldTest.ForeignKeyFieldNullable.Value) ? widgetListById[fieldTest.ForeignKeyFieldNullable.Value] : null; } else if (fieldTest.ForeignKeyFieldNullableWidgetPopulated) { toBeChecked.Add(fieldTest.ForeignKeyFieldNullableWidget); } } // If there's any "to be checked" (because they were already loaded) let the entiies own // repo do whatever checks it needs to do if (toBeChecked.Count > 0) { WidgetRepo.Populate(toBeChecked, stillToPopulate); } } }