<ProgramFilesX64>\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll AutoMapper AutoMapper Newtonsoft.Json Newtonsoft.Json.Converters Newtonsoft.Json.Linq Newtonsoft.Json.Schema Newtonsoft.Json.Serialization System System.Diagnostics System.Diagnostics.Tracing System.IO.Compression AutoMapper.Configuration.Annotations static UserQuery private IDResolver idResolver = new IDResolver(); protected MapperConfiguration config { get; } = new MapperConfiguration(cfg => { cfg.AddMaps(Assembly.GetExecutingAssembly()); cfg.Advanced.AllowAdditiveTypeMapCreation = true; cfg.ValidateInlineMaps = false; }); void Main() { NameBrandExpiryComparer nameBrandExpiryEqC = new NameBrandExpiryComparer(); NameBrandComparer nameBrandEqC = new NameBrandComparer(); Mapper.Reset(); IMapper mapper = new Mapper(config); mapper.ConfigurationProvider.CompileMappings(); mapper.ConfigurationProvider.AssertConfigurationIsValid(); var path = @"C:\Users\Tlamb\Downloads"; var json = "medications.json"; var data = LoadFile(Path.Combine(path, json)); var meds = mapper.Map>(data.records); var medBrandList = meds.Distinct(nameBrandEqC) .OrderBy(m => m.Name).ThenBy(m => m.Brand) .Select((m, i) => mapper.Map(m, opt => opt.Items["id"] = i)) .ToList(); medBrandList.Dump("MedBrands"); var withLabels = medBrandList.Select(m => mapper.Map(m, opt => opt.Items["id"] = m.MedicineID)); //new MedBrandLabel(m)); withLabels.Dump("MedBrands with Labels"); var medList = meds.Distinct(nameBrandExpiryEqC) .Join(medBrandList , exp => new { exp.Name, exp.Brand } , key => new { key.Name, key.Brand }, (exp, key) => new MedInventory { MedicineID = key.MedicineID, Start = exp.Start, Expiry = exp.Expiry, }) .OrderBy(m => m.MedicineID).ThenBy(m => m.Expiry) .ToList(); medList.Dump("Med List"); var medInv = medList.Select(ml => mapper.Map(ml, opt => opt.Items["medBrands"] = withLabels.ToDictionary(key => key.MedicineID, label => label.Label))); medInv.Dump("Med Inventory"); meds.OrderBy(m => m.Name).ThenBy(m => m.Brand).ThenBy(m => m.Expiry).Dump(); } public RootObject LoadFile(string fileName) { var jsonFile = File.ReadAllText(fileName); return JsonConvert.DeserializeObject(jsonFile); } // Define other methods and classes here public class NameBrandExpiryComparer : IEqualityComparer { public bool Equals(Medication med1, Medication med2) { if (med1 == null && med2 == null) return true; else if (med1 == null || med2 == null) return false; else if (med1.Name == med2.Name && med1.Brand == med2.Brand && med1.Expiry == med2.Expiry) return true; else return false; } public int GetHashCode(Medication med) { return $"{med.Name}{med.Brand}{med.Expiry:MMddyyyy}".GetHashCode(); } } public class NameBrandComparer : IEqualityComparer { public bool Equals(Medication med1, Medication med2) { if (med1 == null && med2 == null) return true; else if (med1 == null || med2 == null) return false; else if (med1.Name == med2.Name && med1.Brand == med2.Brand) return true; else return false; } public int GetHashCode(Medication med) { return $"{med.Name}{med.Brand}".GetHashCode(); } } [AutoMap(typeof(Record))] public class Medication { [SourceMember(nameof(Record.field_48_raw))] public int MedicineID { get; set; } [SourceMember(nameof(Record.field_49_raw))] public string Name { get; set; } [SourceMember(nameof(Record.field_50_raw))] public string Brand { get; set; } [SourceMember(nameof(Record.field_51_raw))] public int Start { get; set; } [SourceMember(nameof(Record.field_55_raw))] public int Minimum { get; set; } [SourceMember(nameof(Record.field_57_raw))] public Field57Raw field57 { get; set; } public DateTime Expiry => field57?.iso_timestamp ?? DateTime.MaxValue; [Ignore] public bool NeedsReorder => (Start < Minimum) || (Expiry <= DateTime.Now); } [AutoMap(typeof(Medication))] public class MedBrand { [ValueResolver(typeof(IDResolver))] public int MedicineID { get; set; } public string Name { get; set; } public string Brand { get; set; } public int Minimum { get; set; } [Ignore] public string Dosage { get; set; } [Ignore] public int Package { get; set; } [Ignore] public string Per { get; set; } [Ignore] public string Unit { get; set; } public MedBrand() { Minimum = 10; Dosage = "50mg"; Unit = "Tablet"; Package = 250; Per = "Bottle"; } } [AutoMap(typeof(MedBrand))] public class MedBrandLabel : MedBrand { [Ignore] public string Label => $"{Name} {Brand} {Dosage} {Package} {Per} / {Unit}"; } public class MedInventory { public int MedicineID { get; set; } public int Start { get; set; } public DateTime Expiry { get; set; } public bool NeedsReorder => Expiry <= DateTime.Now; } [AutoMap(typeof(MedInventory))] public class MedInvLabel : MedInventory { [ValueResolver(typeof(BrandResolver))] public string MedicationBrand { get; set; } [Ignore] public string Label => $"{MedicationBrand} {Expiry:MM/dd/yyyy}"; } public class Field57Raw { public string date { get; set; } public string date_formatted { get; set; } public string hours { get; set; } public string minutes { get; set; } public string am_pm { get; set; } public object unix_timestamp { get; set; } public DateTime iso_timestamp { get; set; } public string timestamp { get; set; } public int time { get; set; } } public class Record { public string id { get; set; } public int field_48_raw { get; set; } public string field_49_raw { get; set; } public string field_50_raw { get; set; } public int field_51_raw { get; set; } public int field_52_raw { get; set; } public int field_53_raw { get; set; } public int field_54_raw { get; set; } public int field_55_raw { get; set; } public bool field_56_raw { get; set; } public Field57Raw field_57_raw { get; set; } public string field_58_raw { get; set; } public string field_63_raw { get; set; } } public class RootObject { public List records { get; set; } } public class IDResolver : IValueResolver { public int Resolve(object source, object destination, int id, ResolutionContext context) { id = (int)context.Items["id"]; return id; } } public class BrandResolver : IValueResolver { public string Resolve(MedInventory source, object destination, string label, ResolutionContext context) { label = ((Dictionary)context.Items["medBrands"])[source.MedicineID]; return label; } }